Как обновить массив в цикле foreach?

Я пишу 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) Как обновить массив (@data) в каждой итерации цикла foreach?

2) Как добавить значения в массив ref ($ec) и сохранить их в массиве? Потому что, когда я использую следующий код:

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

Вывод дает мне те же значения для @count и $total.

Пожалуйста, предоставьте мне предложения.


person Space    schedule 04.09.2009    source источник


Ответы (2)


Если я правильно вас понял, просто небольшое изменение в вашем коде. Создайте пустой массив (@data) в начале цикла for. Надеюсь это поможет.

        for my $h (sort keys %table) {
                  my @data;
person Space    schedule 04.09.2009
comment
На самом деле все, что вам нужно сказать, это my @data; внутри цикла, и каждый раз это будет новый @data. - person friedo; 04.09.2009
comment
= () в my @data = (); бессмысленно. Когда вы создаете массив с my, он начинается пустым. Присвоение ему пустого списка ничего не значило, это было ваше время и время Perl. - person Chas. Owens; 04.09.2009

1) Объявите массив @data в верхней части тела цикла, где вы хотите начать с нового пустого массива. Или, может быть, вы хотите сказать @data = @$ec, а не push @data, $ec?

2) Чтобы добавить значения в массив, на который ссылается $ec, вы должны просто сказать sum(@$ec); карта не требуется.

Не совсем понятно, что такое ваша структура данных или что вы пытаетесь с ней сделать. Было бы полезно увидеть, как выглядит образец %table и какие результаты вы ожидаете от него.

person ysth    schedule 04.09.2009