2011-07-18 17 views
2

こんにちは私は、キーが3digitコードで、値がそのコードの下にある要素の数であるハッシュを持っています。私は3digitコードを合計し、要素の数を掛けて、最終的にそれらを追加します。例:どのようにハッシュの要素を合計するには?

000 23 
012 42 
222 34 

[(0+0+0)*23]+[(0+1+2)*42]+[(2+2+2)*34]=0+126+204=330 

ので、私はそれが動作しません

foreach my $key (sort keys %hash){  
@arrSum=split(//, $key); 
    foreach $i (@arrSum){  
    $sum+=$i; 
    $value=$sum*$hash{$key}; 
    }  
} 

を試してみました。実際には各行を考慮する必要があります。代わりに、すべての3digitコードをまとめてまとめます。助けが要る。

答えて

17

は、問題へのよりfunctionalアプローチは、それはまたList::Utilからsumを使用している:

use List::Util qw(sum); 

my %hash = qw(
    000 23 
    012 42 
    222 34 
); 

print sum(map { sum(split //) * $hash{$_} } keys %hash);  # 330 
4

私はあなたのコードに小さな変更を加えた、と私は正しい値を得た:ここ

#!/usr/bin/perl 

use strict; 
use warnings; 

my %hash = (
    "000" => 23, 
    "012" => 42, 
    "222" => 34, 
); 

my $value = 0; 
for my $key (sort keys %hash) 
{ 
    my $sum = 0; 
    my @arrSum = split(//, $key); 
    for my $i (@arrSum) 
    {  
    $sum += $i; 
    } 
    $value += $sum * $hash{$key}; 
} 

print "$value\n"; 
+2

は思えますこの場合は完全に不要です。 –

1

(a + b + c)* d =(a * d)+(b * d)+(c * d)です。

my $value; 
for my $key (keys %hash) {  
    my $sum; 
    $sum += $_ for split(//, $key); 
    $value += $sum * $hash{$key}; 
} 

多かれ少なかれ同じ:あなたがしようとしていたように見える

use List::Util qw(sum); 

my $value; 
for my $key (keys %hash) {  
    $value += sum(split(//, $key)) * $hash{$key}; 
} 
+0

sum(split(//、$ key))) 余分な括弧はありませんか? –

+0

@Chankey Pathak、それは今なくなってしまった。 – ikegami

+0

Magic!...:D:P –

1

この問題は、オーダーメイドのeachのためのようだ:ハッシュのキーをソート

#!/usr/bin/perl 

use warnings; use strict; 
use List::Util qw(sum); 

my %hash = (
    "000" => 23, 
    "012" => 42, 
    "222" => 34, 
); 

my $total; 
while (my ($key, $val) = each %hash) { 
    $total += sum(split //, $key) * $val; 
} 

print "$total\n"; 
関連する問題