2012-12-03 60 views
6

我想从我创建的哈希中加起来的值。在哈希(Perl)中添加值

my $value_count; 
foreach my $key (@keys) { 
    $value_count = sum($words{key}, $value_count); 
} 

然而,当我运行此我得到

Undefined subroutine &main::sum called at C:/Users/Clayton/workspace/main/Main.pl line 54, <$filehandle1> line 174. 

我真的不知道我要去的地方错在这里。我是Perl的新手。

编辑:我尝试使用刚刚+运营商,但我得到的错误

Use of uninitialized value in addition (+) at C:/Users/Clayton/workspace/main/Main.pl line 54, <$filehandle1> line 174. 

差不多我的哈希就像 核心价值 猫2 狗4 大鼠1

所以我我试图将所有的值加起来,这样我就可以取得平均值。

编辑2:实际的修复是在我需要使我的$ value_count = 0的评论。这固定了一切。谢谢你们。我认为这是一个需要解决的重要问题,我认为这可能对其他人有用,所以我将会离开它。

+1

你解决用'key'而不是'$ key'打错字? – Tim

+1

确保您使用'$'信号。你不是你的榜样。 – jmcneirney

+0

@Tim N aww darn我确实有一个错字..... –

回答

20

要使用sum函数,需要使用List::Util包。但是,这并不需要在这种情况下,你可以使用+操作:

$value_count = $value_count + $words{$key}; 
# or $value_count += $words{$key}; 

事实上,你可以使用sum,避免循环。这是你应该使用的解决方案:

use List::Util 'sum'; 
my $value_count = sum values %words; 

values函数返回一个散列值列表,并sum总和该列表。如果你不想总和所有按键,使用散列切片:

use List::Util 'sum'; 
my $value_count = sum @words{@keys}; 
+1

我认为使用'values'可能比hash片段更直接:'perl -MList :: Util = sum -le'%h =(one => 1,ten => 10,six => 6);打印总和(值%h)'' – Ashley

+0

@Ashley是的,但这只适用于如果你想总结所有的值。 – Tim

+0

你的意思是像在OP中:P – Ashley

3

你应该罚款,如果你更换:

$value_count = sum($words{key}, $value_count); 

有了:

$value_count += $words{key};