如何基于key获取Hash的多个值

时间:2015-07-23 15:44:20

标签: perl

我从csv获取数据并在hash中存储数据。从那里我想提供密钥并基于该密钥我想获得Hash的所有值。可以是重复密钥,我想要所有哈希值。

代表:

 **SpecID           Note_Text**

 300000111166   LDPE Bottle/Jar
 300000111166   Poly-lined Steel Drum
 300000057768   Amber Glass Bottle/Jar

现在,如果我给出密钥:300000111166

我应该得到价值:LDPE瓶/罐,聚乙烯钢桶。如何做到。

1 个答案:

答案 0 :(得分:5)

使用数组引用作为哈希值。在查看输入时,push会为哈希值而不是分配它们。检索哈希值时,请记住必须取消引用哈希值才能看到内容。

 while (<FH>) {
     ($key,$value) = split /\t/;
     push @{$hash{$key}}, $value;
 }
 ...
 foreach $key (keys %hash) {
     print "values for $key: ";
     print join(",", @{$hash{$key}}), "\n";
 }

使用多维哈希。这种方法的一个优点是重复值不会打印两次(或者这可能是一个缺点,具体取决于您希望如何处理重复值)

while (<FH>) {
    ($key,$value) = split /\t/;
    $hash{$key}{$value}++;
}
...
foreach $key (keys %hash) {
     print "values for $key: ";
     print join(",", keys %{$hash{$key}}), "\n";
}

对此问题使用经过验证的解决方案:the Tie::Hash::MultiValue module

use Tie::Hash::MultiValue;
tie %hash, 'Tie::Hash::MultiValue';
while (<FH>) {
    ($key,$value) = split /\t/;
    $hash{$key} = $value;
}
...
foreach $key (keys %hash) {
     print "values for $key: ";
     print join(",", @{$hash{$key}}), "\n";
}