如何在Perl中连接重复哈希键的值?
我知道哈希中不可能有重复的键,但我的数据是这样的:如何在Perl中连接重复哈希键的值?,perl,Perl,我知道哈希中不可能有重复的键,但我的数据是这样的: Key Value SETUP_FACE_PROT great SETUP_FACE_PROT great2 SETUP_FACE_PROT great3 SETUP_FACE_PROT great3 SETUP_ARM_PROT arm SETUP_FOOT_PROT foot SETUP_FOOT_PROT foot2 SETUP_HEAD_PROT gogg
Key Value
SETUP_FACE_PROT great
SETUP_FACE_PROT great2
SETUP_FACE_PROT great3
SETUP_FACE_PROT great3
SETUP_ARM_PROT arm
SETUP_FOOT_PROT foot
SETUP_FOOT_PROT foot2
SETUP_HEAD_PROT goggle
我想连接重复键的值,用*
字符分隔。例如,我希望输出是这样的:
SETUP_FACE_PROT'=great*great2*great3',
SETUP_ARM_PROT='arm',
SETUP_FOOT_PROT='foot*foot2',
SETUP_HEAD_PROT='google'
到目前为止,我就是这样试图解决这个问题的:
foreach my $key ( sort keys %stuff )
{
print "$key=\'", join( "*", @{ $stuff{$key} } ), "\'\n";
}
但是,如何将结果存储在变量中,以便将其传递给另一个子例程,而不是打印结果呢?我正在尝试创建一个新字符串,如下所示:
$newstring="
SETUP_FACE_PROT='great*great2*great3',
SETUP_ARM_PROT='arm',
SETUP_FOOT_PROT='foot*foot2',
SETUP_HEAD_PROT='google' "
不能复制密钥,可以创建数组哈希
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my %stuff;
while (<DATA>) {
my ( $key, $value ) = split;
push( @{ $stuff{$key} }, $value );
}
print Dumper \%stuff;
foreach my $key ( sort keys %stuff ) {
print "$key=\'", join( "*", @{ $stuff{$key} } ), "\'\n";
}
__DATA__
SETUP_FACE_PROT great
SETUP_FACE_PROT great2
SETUP_FACE_PROT great3
SETUP_FACE_PROT great3
SETUP_ARM_PROT arm
SETUP_FOOT_PROT foot
SETUP_FOOT_PROT foot2
SETUP_HEAD_PROT goggle
或者可以使用带有文件句柄的print
:
my $results;
open ( my $output, '>', \$results );
foreach my $key ( sort keys %stuff ) {
print {$output} "$key=\'", join( "*", @{ $stuff{$key} } ), "\'\n";
}
close ( $output );
print $results;
最后我得到了一个答案
use Data::Dumper;
my %stuff;
use Text::CSV;
my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ });
my $filenamex = 'duplicate2.csv';
$checkstring ='';
open(my $datab, '<', $filenamex) or die "Could not open '$filename' $!\n";
$i=1;
my %datan;
while (my $linea = <$datab>)
{
chomp $linea;
@fieldsx = split ",",$linea;
$key = $fieldsx[0];
$value = $fieldsx[1];
# print $key;
push( @{ $stuff{$key} }, $value );
}
foreach my $key ( sort keys %stuff )
{
$checkstring = $checkstring.','.$key.'='. join( "*", @{ $stuff{$key} } );
}
print $checkstring;
使用数据::转储程序;
我的%的东西;
使用Text::CSV;
my$csv=Text::csv_XS->new({binary=>1,eol=>$/});
my$filenamex='duplicate2.csv';
$checkstring='';
打开(my$datab,'但我想返回该变量,而不是打印。有什么想法吗?以及如何将其存储在variable.whole result中。将其返回到哪里?这将生成与您的问题相同的输出。您不提供任何详细信息,因此我无法回答。同意。实际上,我说的不是打印:“$key=\”,join(“,@{$stuff{$key}),“\”\n”;我想]将其存储在变量中。因此,我将得到的最终结果是:SETUP_FACE_PROT='greatgreat2*great3',SETUP_FACE_PROT='arm',SETUP_FOOT_PROT='FOOT*foot2',SETUP_HEAD_PROT='google'如果您对所需的输出有进一步的说明,那么最好将其编辑到您的问题中。为什么要加载Text::CSV,创建Text::CSV解析器对象和不使用它吗?另外,Sobrique的是一个更干净的代码版本。为什么不使用它呢?好的。更新了答案,包含了一个包含数据的变量。
use Data::Dumper;
my %stuff;
use Text::CSV;
my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ });
my $filenamex = 'duplicate2.csv';
$checkstring ='';
open(my $datab, '<', $filenamex) or die "Could not open '$filename' $!\n";
$i=1;
my %datan;
while (my $linea = <$datab>)
{
chomp $linea;
@fieldsx = split ",",$linea;
$key = $fieldsx[0];
$value = $fieldsx[1];
# print $key;
push( @{ $stuff{$key} }, $value );
}
foreach my $key ( sort keys %stuff )
{
$checkstring = $checkstring.','.$key.'='. join( "*", @{ $stuff{$key} } );
}
print $checkstring;