2013-03-19 13 views
5

Mam duży zestaw skrótów, chcę pobrać niektóre mieszania z tablicy i wstawić do nowej tablicy bez zmiany pierwszej tablicy. Mam problem, przesuwając hasz do tablicy, jak uzyskać dostęp do ego elementu, który jest hash.Jak uzyskać dostęp do tablicy mieszania w perlu?

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. 
} 

Odpowiedz

12

Najpierw należy

use strict; 
use warnings; 

następnie zdefiniować

my $my_hash; 

zainicjować $my_hash przed przypisać wartości, ponieważ w przeciwnym razie go zastąpić, a wszystkie trzy elementy wskazują na ten sam hash

$my_hash = {}; 

i wreszcie, aby uzyskać dostęp do hash za członków

$myarray[$i]->{firstname} 

lub wydrukować cały hash, można użyć Data::Dumper np

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

lub jakaś inna metoda, How can I print the contents of a hash in Perl? lub How do I print a hash structure in Perl?

Zaktualizuj do Twojego komentarza:

Powodujesz skopiowanie skrótów o wartości

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

do nowej tablicy, która działa idealnie. Można zweryfikować, korzystając z następujących wartości, że obie tablice mają takie same skróty.

Jeśli chcesz wykonać głęboką kopię, zamiast tylko odniesienia, możesz przydzielić nowy skrót i skopiować element ith do kopii. Następnie zapisać kopię w @modifymyhash

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

Użyłem obu łańcuchów i ostrzeżeń. I ja również zainicjowałem i zdefiniowałem my_hash. Chcę przesunąć cały skrót do nowej tablicy. Dzięki i tak. – mysteriousboy

+1

@mysteriousboy Już wypchnąłeś skróty do '@ modifymyhash'. Co z tym jest nie tak? –

2

Aby dereference mieszania używać %{ ... }:

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

To chyba jeszcze nie to, co chcesz. Aby ładnie zaimportować hasz, musisz go powtórzyć, nie ma "ładnego" uszeregowania:

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