我有一个哈希是这样的:
abc=>1
hello=>32
abc=>4
hello=>23
hello=>12
xyz=>18
我们如何可以连接的价值观,它的键是一样的。 因此,输出将是:
abc=>"1,4"
hello=>"23,12,32"
xyz=>"18".
我试图通过排序由键然后为每个键检查,如果他们是相同的,然后串联值的哈希,但我没有得到该如何比较同一回路的两个键。
提前致谢。
我有一个哈希是这样的:
abc=>1
hello=>32
abc=>4
hello=>23
hello=>12
xyz=>18
我们如何可以连接的价值观,它的键是一样的。 因此,输出将是:
abc=>"1,4"
hello=>"23,12,32"
xyz=>"18".
我试图通过排序由键然后为每个键检查,如果他们是相同的,然后串联值的哈希,但我没有得到该如何比较同一回路的两个键。
提前致谢。
这个作品的确切方式取决于你的数据的真正来源,但这个方案显示了一种方法来读取信息DATA
文件句柄来构建和倾倒哈希值。
散列值是包含对应于相同的键的所有值匿名阵列。
use strict;
use warnings;
my %data;
while (<DATA>) {
my ($k, $v) = /\w+/g;
push @{ $data{$k} }, $v;
}
for my $k (sort keys %data) {
printf "%s => %s\n", $k, join ',', @{ $data{$k} };
}
__DATA__
abc=>1
hello=>32
abc=>4
hello=>23
hello=>12
xyz=>18
产量
abc => 1,4
hello => 32,23,12
xyz => 18
如果这是你所谈论的,那么你可以做类似的键值对列表:
my @kv = (
abc=>1,
hello=>32,
abc=>4,
hello=>23,
hello=>12,
xyz=>18,
);
my %hash;
while(@kv){
my $k = shift @kv;
my $v = shift @kv;
$hash{$k} = defined $hash{$k} ? "$hash{$k},$v" : $v;
}
my @pairs = (
abc=>1,
hello=>32,
abc=>4,
hello=>23,
hello=>12,
xyz=>18,
);
my %hash;
# collect
for(my $idx = 0; $idx < scalar @pairs; $idx += 2){
my $key = $pairs[$idx];
my $val = $pairs[$idx+1];
push @{ $hash{$key} }, $val;
}
# print combined
while( my ($key, $val) = each %hash ){
print "$key = ", join(',', @$val), "\n";
}
由于目前还不清楚你真正努力去做,我猜,你有你需要修改一个文件。 在这种情况下,一个班轮可能是为了。
perl -lwne '
($k,$v) = split /=>/;
$data{$k} = join ",", $data{$k} // (), $v }{
print "$_=>$data{$_}" for keys %data' input.txt > output.txt
输出:
hello=>32,23,12
abc=>1,4
xyz=>18
请注意,在输出的密钥将无法在相同的顺序输入。 你可以,如果你喜欢的键排序,但我选择不。
说明:
-l
将删除行尾一边读书,并把他们的背部,同时打印 -n
将放置while(<>)
循环程序周围,读取文件(或STDIN)一行一行。 //
是defined-or
操作者 。 这将返回RHS如果LHS是不确定的。 }{
是爱斯基摩人的亲吻运营商只与工作-n
选项。 它的作用是基本相同作为END块,它执行在输入的端部的下面的代码。