Pergunta

Estou escrevendo um script Perl para fazer algumas operações matemáticas em um hash. Este hash contém os valores conforme fornecido na amostra abaixo. Eu escrevi o código abaixo. Se eu executar esse código para um valor de matriz separadamente sem usar um loop foreach, a saída será boa. Mas se eu executar isso usando um loop foreach nos valores da matriz, a soma dos valores em A são bons, mas a partir da saída adiciona os valores anteriores.

Hash Sample:

$VAR1 = 'A';
$VAR2 = {
    '"x"' => [values],
    '"y"' => [values],
    and so on...
$VAR3 = 'B';
$VAR4 = {
        '"x"' => [values],
    '"y"' => [values],
    and so on...
$VARn....

Código:

#!/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";
}

Eu acho que o problema está com esta linha. Ele está armazenando todos os valores anteriores e, portanto, adicionando todos os valores no próximo loop foreach.

push @data, $ec;

Então, aqui tenho dois problemas:

1) Como posso atualizar a matriz (@data) em cada iteração do loop de foreach?

2) Como posso adicionar os valores na referência de matriz ($ ec) e armazená -los em uma matriz? Porque quando eu uso o seguinte código:

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

A saída me dá os mesmos valores para @Count e $ Total.

Por favor, me forneça sugestões.

Foi útil?

Solução

Se eu entendi corretamente, apenas uma pequena alteração no seu código. Faça uma matriz vazia (@data) no início do loop. Espero que isto ajude.

        for my $h (sort keys %table) {
                  my @data;

Outras dicas

1) Declare a matriz @Data na parte superior do corpo do loop, onde deseja começar com uma matriz fresca e vazia. Ou talvez você pretenda dizer @data = @$ec, não push @data, $ec?

2) Para adicionar os valores na matriz referida por $ ec, você apenas diria sum(@$ec); Nenhum mapa é necessário.

Não está completamente claro qual é a sua estrutura de dados ou o que você está tentando fazer com ela. Ajudaria a ver como é uma tabela de amostra e quais são os resultados que você espera.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top