2013-02-27 106 views
-2

我想获得每个组的条目数,但它似乎给了我错误的答案。每个组中都有可能会重复的元素。我得到的结果没有意义。我究竟做错了什么?如何获取散列perl哈希中的密钥数量?

my %hash; 
while(<>) 
{ 
    chomp($_); 
    if(/(\d+)\t(\d+)/) 
    { 
     my $group = $1; 
     my $element = $2; 
     $hash{$group}{$element}=1; 
    } 
} 

foreach my $curr(keys %hash) 
{ 
    my $numElementsInCurr = keys %{$hash{$curr}}; 
    print "$curr\t$numElementsInCurr\n"; 
} 
+1

你确定你的输入以及怎样形成的?您可以使用'Data :: Dumper'来检查'%hash',看看它是否与您期望的一样。 – zigdon 2013-02-27 01:55:35

+1

你应该提到你为什么认为它给你错误的答案。只是发布代码,做它应该是不会帮助的。例如打印'%hash'的Dumper输出并显示循环的输出。 – TLP 2013-02-27 02:01:36

+1

你还没有完全证明这个问题。你的代码不太可运行(我已经修复),但是你没有提供导致错误发生的数据。获得该数据的输出以及您期望的输出也很好。 – ikegami 2013-02-27 02:06:38

回答

0

如果一个组中的元素可以重来,你需要你的计数,包括这些重复的,你需要做更多的东西一样:

my %hash; 
while(<>) 
{ 
    chomp($_); 
    if(/(\d+)\t(\d+)/) 
    { 
     my $group = $1; 
     my $element = $2; 
     ++$hash{$group}{$element}; 
    } 
} 

use List::Util 'sum'; 

foreach my $curr(keys %hash) 
{ 
    my $numElementsInCurr = sum values %{$hash{$curr}}; 
    print "$curr\t$numElementsInCurr\n"; 
}