0

我正在编写一个 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;

所以,这里我有两个问题:

1)如何在每次 foreach 循环迭代中刷新数组(@data)?

2) 如何在数组 ref ($ec) 中添加值并将它们存储在数组中?因为当我使用以下代码时:

for $ec ($table{$h}{$et}) {
    @count = map { sum(@{$_}) } @$ec;
    $total = sum(@count);
}

输出为我提供了相同的 @count 和 $total 值。

请给我一些建议。

4

2 回答 2

4

如果我对您的理解正确,只需对您的代码进行一点改动。@data在 for 循环的开头创建一个空数组 ( )。希望这可以帮助。

        for my $h (sort keys %table) {
                  my @data;
于 2009-09-04T10:58:09.490 回答
0

1) 在循环体的顶部声明@data 数组,您想从一个新的空数组开始。或者你的意思是说@data = @$ec,不是push @data, $ec

2) 要在 $ec 引用的数组中添加值,您只需说sum(@$ec); 不需要地图。

尚不完全清楚您的数据结构是什么或您试图用它做什么。这将有助于查看示例 %table 的外观以及您期望从中获得什么结果。

于 2009-09-04T14:59:27.457 回答