我正在编写一个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提供了相同的值。
请向我提供建议。
答案 0 :(得分:4)
如果我理解正确,只需对代码进行一些小改动即可。在for循环的开头创建一个空数组(@data
)。希望这可以帮助。
for my $h (sort keys %table) {
my @data;
答案 1 :(得分:0)
1)在循环体的顶部声明@data数组,在那里你要用一个新的空数组开始。或者你的意思是说@data = @$ec
,而不是push @data, $ec
?
2)要添加$ ec引用的数组中的值,您只需说sum(@$ec)
;不需要地图。
您的数据结构是什么或者您尝试使用它做什么并不完全清楚。 这将有助于查看示例%表的样子以及您对它的期望结果。