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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top