Come rinfresco un array in un ciclo foreach?
-
21-09-2019 - |
Domanda
Sto scrivendo uno script Perl per fare alcune operazioni matematiche su un hash. Questo hash contiene i valori come indicato nella esempio riportato di seguito. Ho scritto il codice qui sotto. Se eseguo questo codice per un valore di matrice separatamente senza utilizzare un ciclo foreach, l'uscita è soddisfacente. Ma se corro questo utilizzando un ciclo foreach sui valori di matrice, la somma dei valori in A sono buone, ma da B l'uscita aggiungere i valori precedenti.
Hash Sample:
$VAR1 = 'A';
$VAR2 = {
'"x"' => [values],
'"y"' => [values],
and so on...
$VAR3 = 'B';
$VAR4 = {
'"x"' => [values],
'"y"' => [values],
and so on...
$VARn....
Codice:
#!/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";
}
Credo che il problema è con questa linea. È memorizzare tutti i valori precedenti e quindi sommando tutti i valori nel successivo ciclo foreach.
push @data, $ec;
Quindi, qui ho due problemi:
1) Come posso aggiornare l'array (@data) in ciascuna iterazione del ciclo foreach?
2) Come posso aggiungere i valori nella matrice ref ($ CE) e memorizzarli in un array? Perché quando io uso il seguente codice:
for $ec ($table{$h}{$et}) {
@count = map { sum(@{$_}) } @$ec;
$total = sum(@count);
}
L'uscita mi dà gli stessi valori per @count e $ totale.
Si prega di fornire me con suggerimenti.
Soluzione
Se ho capito bene, solo un piccolo cambiamento nel codice. Creare un array vuoto (@data
) all'inizio del ciclo. Spero che sia di aiuto.
for my $h (sort keys %table) {
my @data;
Altri suggerimenti
1) Dichiara l'array @data nella parte superiore del corpo del ciclo in cui si desidera iniziare con una, serie fresca vuoto. O forse vuoi dire voler dire @data = @$ec
, non push @data, $ec
?
2) Per aggiungere i valori nella matrice a cui si riferisce $ CE, si sarebbe solo dire sum(@$ec)
; nessuna mappa richiesta.
Non è del tutto chiaro che cosa il vostro struttura dati è o ciò che si sta cercando di fare con esso. Sarebbe utile per vedere ciò che una tabella di esempio% si presenta come e quali risultati che ci si aspetta da esso.