Как суммировать элементы хэша? - PullRequest
2 голосов
/ 18 июля 2011

Привет, у меня есть хеш, где ключ - это 3digit-код, а value - количество элементов в этом коде.Я хочу сложить 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 одновременно.Нужна помощь.

Ответы [ 4 ]

17 голосов
/ 18 июля 2011

Вот еще функциональный подход к проблеме, он также использует sum из List :: Util :

use List::Util qw(sum);

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

print sum(map { sum(split //) * $hash{$_} } keys %hash);     # 330
4 голосов
/ 18 июля 2011

Я внес небольшое изменение в ваш код и получил правильное значение:

#!/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";
1 голос
/ 19 июля 2011

Эта проблема выглядит специально для каждого :

#!/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";
1 голос
/ 18 июля 2011

(a + b + c) * d = (a * d) + (b * d) + (c * d), так что вы можете сделать

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

Но похоже, что вы былипытается:

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};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...