ハッシュに対していくつかの数学的操作を行う Perl スクリプトを作成しています。このハッシュには、以下のサンプルに示す値が含まれています。以下のコードを書きました。foreach ループを使用せずに配列値に対してこのコードを個別に実行すると、出力は問題ありません。しかし、配列値に対して foreach ループを使用してこれを実行すると、A の値の合計は良好ですが、B からの出力には前の値が追加されます。
Hash Sample:
$VAR1 = 'A';
$VAR2 = {
'"x"' => [values],
'"y"' => [values],
and so on...
$VAR3 = 'B';
$VAR4 = {
'"x"' => [values],
'"y"' => [values],
and so on...
$VARn....
コード:
#!/usr/bin/perl -w
use strict;
use List::Util qw(sum);
my @data;
my @count;
my $total;
my @array = ("A", "B", "C", "D");
foreach my $v (@array) {
my %table = getV($v); #getV is a subroutine returing a hash.
for my $h (sort keys %table) {
for my $et (sort keys %{ $table{$h} } ) {
for $ec ($table{$h}{$et}) {
push @data, $ec;
@count = map { sum(@{$_}) } @data;
$total = sum(@count);
}
}
print "sum of $v is $total\n";
}
問題はこの行にあると思います。以前のすべての値を保存しているため、次の foreach ループですべての値を追加します。
push @data, $ec;
したがって、ここに 2 つの問題があります。
1) foreach ループの反復ごとに配列 (@data) を更新するにはどうすればよいですか?
2) 配列 ref ($ec) に値を追加して配列に格納するにはどうすればよいですか? 次のコードを使用する場合:
for $ec ($table{$h}{$et}) {
@count = map { sum(@{$_}) } @$ec;
$total = sum(@count);
}
出力では、@count と $total に同じ値が返されます。
提案を教えてください。