2013-03-19 9 views
5

Ho una vasta gamma di hash, voglio prendere un po 'di hash dall'array e inserirmi nel nuovo array senza modificare il primo array. Sto avendo problemi a spingere l'hash all'array, come posso accedere all'elemento ith che è un hash.Come accedere alla matrice di hash in perl?

my @myarray; 
$my_hash->{firstname} = "firstname"; 
$my_hash->{lastname} = "lastname"; 
$my_hash->{age} = "25"; 
$my_hash->{location} = "WI"; 
push @myarray,$my_hash; 

$my_hash->{firstname} = "Lily"; 
$my_hash->{lastname} = "Bily"; 
$my_hash->{age} = "22"; 
$my_hash->{location} = "CA"; 
push @myarray,$my_hash; 

$my_hash->{firstname} = "something"; 
$my_hash->{lastname} = "otherthing"; 
$my_hash->{age} = "22"; 
$my_hash->{location} = "NY"; 
push @myarray,$my_hash; 

my @modifymyhash; 
for (my $i=0;$i<2; $i++) { 
     print "No ".$i."\n"; 
     push (@modifymyhash, $myarray[$i]); 
     print "".$myarray[$i]."\n"; #How do I print first ith element of array which is hash. 
} 

risposta

12

primo luogo si dovrebbe

use strict; 
use warnings; 

quindi definire

my $my_hash; 

inizializzare $my_hash prima di assegnare i valori, perché altrimenti si sovrascrive e tutti e tre gli elementi puntare per lo stesso hash

$my_hash = {}; 

e, infine, di accedere ai membri del hash

$myarray[$i]->{firstname} 

o per stampare l'intera hash, è possibile utilizzare Data::Dumper ad esempio

print Dumper($myarray[$i])."\n"; 

o qualche altro metodo, How can I print the contents of a hash in Perl? o How do I print a hash structure in Perl?

Aggiorna al tuo commento:

Copia gli hash con

push (@modifymyhash, $myarray[$i]); 

nel nuovo array, che funziona perfettamente. È possibile verificare con

foreach my $h (@myarray) { 
    print Dumper($h), "\n"; 
} 

foreach my $h (@modifymyhash) { 
    print Dumper($h), "\n"; 
} 

che entrambi gli array hanno gli stessi hash.

Se si desidera eseguire una copia profonda, anziché solo i riferimenti, è possibile allocare un nuovo hash e copiare l'elemento ith nella copia. Poi conservare la copia in @modifymyhash

my $copy = {}; 
%{$copy} = %{$myarray[$i]}; 
push (@modifymyhash, $copy); 
+0

Ho usato sia la stringa che gli avvertimenti. E ho anche inizializzato e definito my_hash. Voglio spingere l'intero hash in un nuovo array. Grazie comunque. – mysteriousboy

+1

@mysteriousboy Hai già inserito gli hash in '@ modifymyhash'. Cosa c'è che non va? –

2

Per dereferenziare un hash, utilizzare %{ ... }:

print %{ $myarray[$i] }, "\n"; 

Questo probabilmente continua a non fare quello che vuoi. Per stampare un hash bene, devi scorrere su di esso, non c'è una stringa "bella":

print $_, ':', $myarray[$i]{$_}, "\n" for keys %{ $myarray[$i] }; 
Problemi correlati