2012-09-13 15 views
0

我想將散列的所有值相乘而不必調用特定元素。例如。我不要想做$hash{'kv1'} * $hash{'kv2'} * $hash{'kv3'}因爲我不知道散列中元素的數量來做到這一點。在Perl中將哈希中的所有值相乘?

我猜測有一個簡單高效的功能來做到這一點,也許使用each什麼的,但我找不到任何示例要遵循。有任何想法嗎?

回答

9

從1開始(因爲1乘以任何東西就是你的倍數),然後遍歷散列的值並將當前總值乘以散列值。

#!/usr/bin/env perl 

use v5.12; 
my %hash = (a => 1, b => 2, c => 3, d => 4); 
my $value = 1; 
$value = $value * $_ foreach values %hash; 
say $value; 
+0

感謝,只是意識到自己:) – dgBP

+0

使用'$值* = $ _' – dgBP

2

這不行嗎?

my $m = 1; 
for (values %my_hash) { 
    $m *= $_; 
} 
+0

縮短一點,因爲你不能分配一個值'M' – Quentin

+0

耶..corrected。 – Vijay

4

我會遍歷keys %hash這樣的:

my $prod = 1; 
$prod *= $hash{$_} for keys %hash; 
+0

嗯,由於某種原因,我*從來沒有*使用'值'... – pmakholm

+1

'values'應該沒問題,因爲我不需要擔心元素的順序 – dgBP

+0

這更多地反映了我自己的編碼風格與其他答案比指示然後我比其他人更聰明... – pmakholm

9

這就是List::Util減少爲:

use List::Util 'reduce'; 

my %hash = (foo => 3, bar => 7, baz => 2); 

say reduce { our $a * our $b } values %hash; 

輸出:

個42

+0

謝謝@darch! :) – memowe