级联哈希值时,关键是在Perl一样(concatenate hash values when key

2019-06-25 04:56发布

我有一个哈希是这样的:

abc=>1
hello=>32
abc=>4
hello=>23
hello=>12
xyz=>18

我们如何可以连接的价值观,它的键是一样的。 因此,输出将是:

abc=>"1,4"
hello=>"23,12,32"
xyz=>"18".

我试图通过排序由键然后为每个键检查,如果他们是相同的,然后串联值的哈希,但我没有得到该如何比较同一回路的两个键。

提前致谢。

Answer 1:

这个作品的确切方式取决于你的数据的真正来源,但这个方案显示了一种方法来读取信息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


Answer 2:

如果这是你所谈论的,那么你可以做类似的键值对列表:

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;
}


Answer 3:

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";
}


Answer 4:

由于目前还不清楚你真正努力去做,我猜,你有你需要修改一个文件。 在这种情况下,一个班轮可能是为了。

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块,它执行在输入的端部的下面的代码。


文章来源: concatenate hash values when key is same in perl
标签: perl hash