Conversione della struttura dei dati in Perl [chiuso]

0

Una funzione produce questo hash di array:

'KEYNAME1' => ARRAY(0x1edeeb0)
   0  'val11'
   1  'val12'
   2  'val13'
'KEYNAME2' => ARRAY(0x1efacb8)
   0  'val21'
   1  'val22'
   2  'val23'

Un'altra funzione richiede una serie di hash contenenti array:

0  HASH(0x1f6df98)
   'KEYNAME1' => ARRAY(0x1f776b0)
      0  'val11'
      1  'val12'
      2  'val13'
1  HASH(0x1f6dfe0)
   'KEYNAME2' => ARRAY(0x1f6df80)
      0  'val21'
      1  'val22'
      2  'val23'

Questo codice converte il primo al secondo, ma esiste un modo più semplice?

    
posta chris 13.08.2012 - 01:27
fonte

1 risposta

1

Questo segmento di codice è ridondante perché @{$hash{$feld}} contiene già esattamente ciò che produci in @array .

my @array;
foreach my $wert (@ {$hash{$feld}}) {
    print "wert $wert";
    push @array, $wert;
}

Ecco una soluzione più semplice.

use Data::Dumper;

my %hash = (
    KEYNAME1 => [qw( val11 val12 val12 )],
    KEYNAME2 => [qw( val21 val22 val23 )],
);
print Dumper \%hash;

my @array;
while ( my ($key, $val) = each %hash ) {
    push @array, {$key => $val};
}
print Dumper \@array;

Una mappa può essere usata al posto del ciclo while, ma penso che il ciclo sia più facile da leggere.

my @array = map { {$_ => $hash{$_}} } keys %hash;
    
risposta data 14.08.2012 - 02:03
fonte

Leggi altre domande sui tag