2

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

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

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

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

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

谢谢!

4

3 回答 3

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
        ];
于 2012-07-05T15:57:10.690 回答
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;
于 2012-07-05T15:59:55.257 回答
2

为了蒂姆托迪!

# 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当您需要对数组的每个元素(或数组的数组,如本例中)执行某些操作(例如转换)时,构造是好的。但是在这里,您只需要为每个元素提供一些东西——换句话说,就是一张地图。)

于 2012-07-05T16:04:02.347 回答