一次添加多个数组perl

时间:2012-07-05 15:43:12

标签: arrays perl sum

我有大约50个数组填充数字,我必须为每个数组报告所有这些元素的总和,所以最终结果有50个单独的数组。

有没有更短的方法来做,而不是为每个数组编写不同的for循环?

我是perl的初学者。任何有用的意见/建议将不胜感激。

到目前为止,这是我的代码:

for( $j = 1 ; $j <= 50 ; $j++ ) {
  for ( @arr[$j] ) {
    $sum[$j] += $_;
  }
  print $sum[$j];
}

谢谢!

3 个答案:

答案 0 :(得分:7)

假设你有一个数组数组,你可以使用List::Utilmap

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

my @arrays = (
    [1,2,3],
    [4,5,6],
    [7,8,9]
); 
my @sums   = map sum(@$_), @arrays;   # sum each array
print Dumper \@sums;

<强>输出:

$VAR1 = [
          '6',       # sum of $arrays[0]
          '15',      #                1
          '24'       #                2
        ];

答案 1 :(得分:4)

use strict; use warnings;

use List::Util qw ( sum );

my %data = (
   cats => [ map +(rand 100), 1 .. 10 ],
   dogs => [ map +(100 - rand 100), 1 .. 20 ],
);

my %sums = map { $_ => sum(@{ $data{$_} }) } keys %data;

use YAML;
print Dump \%data, \%sums;

答案 2 :(得分:2)

对于TIMTOWTDI!

# You cannot store arrays within arrays just with ((...), (...)) syntax, 
# as this list will be flattened.
# Instead you should store _references_ to arrays, like this:
my @array_of_arrays = ([1..3], [4..6], [8..10]); 
my @sums_of_arrays;

# ... then iterate over it, arrayref by arrayref
# (if `map` is somehow not for you) :)
for my $ref_arr (@array_of_arrays) {
   my $arr_sum;
   for my $el (@$ref_arr) {
     $arr_sum += $el;
   }
   push @sums_of_arrays, $arr_sum;
}

请注意,我认为这个解决方案不如@TLP和@SinanÜnür给出的解决方案。当需要对数组的每个元素(或数组数组,如本例中)进行某些操作(例如,转换)时,For构造是好的。但是在这里你只需要为每个元素提供一些东西 - 换句话说,就是地图。 )