2

数値で満たされた約 50 個の配列があり、すべての配列のこれらすべての要素の合計を報告する必要があるため、最終結果には個々の配列の 50 個の合計が含まれます。

配列ごとに異なる for ループを記述するよりも、それを行うためのより短い方法はありますか?

perl初心者です。役立つコメントや提案をいただければ幸いです。

これまでの私のコードは次のとおりです。

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

ありがとうございました!

4

3 に答える 3

7

配列の配列があると仮定すると、List::Utilとを使用できます。map

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

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コンストラクトは、配列 (またはこの場合のように配列の配列) の各要素に対して何かを行う (たとえば、変換する) 必要がある場合に適しています。しかしここでは、要素ごとに何か、つまりマップが必要なだけです。)

于 2012-07-05T16:04:02.347 に答える