2012-12-03 61 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};