2013-03-19 16 views
5

Büyük bir karma dizim var, diziden bazı karmaları almak ve ilk diziyi değiştirmeden yeni diziye eklemek istiyorum. Ben hash için hash itmek sorun yaşıyorum, bir karma olan ith elemanına nasıl erişebilirim.Perl'deki karma dizisine nasıl erişirim?

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

cevap

12

Önce değerleri atamak önce aksi üzerine yazmak çünkü

use strict; 
use warnings; 

sonra,

my $my_hash; 

$my_hash başlatmak tanımlamak gerekir ve her üç element aynı karma işaret

$my_hash = {}; 

ve son olarak erişmek için hash üyeleri

$myarray[$i]->{firstname} 

veya tüm karma yazdırmak için, örneğin Data::Dumper kullanabilirsiniz

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

veya başka yöntem How can I print the contents of a hash in Perl? veya How do I print a hash structure in Perl?

Yorum yapmak için güncelleyin:

Sen mükemmel çalışıyor yeni dizi haline

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

ile karmaları kopyalayın. Her iki dizinin de aynı karıĢımlara sahip olduğu

ile doğrulayabilirsiniz.

Sadece referanslar yerine derin bir kopyasını oluşturmak istiyorsanız, yeni bir karma ayırabilir ve kopyanın içine ith öğesini kopyalayabilirsiniz. Sonra karma KQUEUE için @modifymyhash

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

Hem dize hem de uyarılar kullandım. Ve ben de my_hash'ı başlatıyorum ve tanımladım. Bütün hashı yeni diziye sokmak istiyorum. Yine de teşekkürler. – mysteriousboy

+1

@mysteriousboy Zaten hash'ları '@ modifymyhash' içine ittiniz. Bunun derdi ne? –

2

kopyayı depolamak, %{ ... } kullanın:

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

Bu muhtemelen hala ne istediğinizi yapmaz. Bir hash güzelce yazdırmak için üzerinde yineleme var, "güzel" dize yok:

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