2013-03-19 68 views
5

我有一個大的散列數組,我想從數組中獲取一些散列並插入到新數組中而不更改第一個數組。我有問題將哈希推向數組,我如何訪問哈希的第i個元素。如何訪問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. 
} 

回答

12

首先,你應該

use strict; 
use warnings; 

然後定義

my $my_hash; 

初始化$my_hash您指定值之前,否則您覆蓋它和所有三個要素指向相同的哈希

$my_hash = {}; 

最後,訪問散列成員

$myarray[$i]->{firstname} 

或打印整個哈希,您可以使用Data::Dumper例如

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

或其他方法,How can I print the contents of a hash in Perl?How do I print a hash structure in Perl?

更新給你的評論:

您與

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

複製的散列到新陣列,它完美的作品。您可以使用

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

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

驗證兩個數組具有相同的哈希值。

如果要製作深度複製而不是僅引用,則可以分配新散列並將ith元素複製到副本中。然後在@modifymyhash

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

我已經使用了字符串和警告。我還初始化並定義了my_hash。我想將整個散列推入新陣列。不管怎麼說,還是要謝謝你。 – mysteriousboy 2013-03-19 21:11:32

+1

@mysteriousboy你已經將哈希推入'@ modifymyhash'。那有什麼問題? – 2013-03-19 21:16:51

2

的副本存儲取消引用哈希,使用%{ ... }

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

這可能仍然無法做你想做的。要打印一個散列很好,你必須遍歷它,沒有「很好」的字符串化:

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