Como faço para refrescar uma matriz em um loop foreach?
-
21-09-2019 - |
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.
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.