我有一大堆哈希,我想从数组中获取一些哈希并插入新数组而不更改第一个数组。我有问题将哈希推送到数组,如何访问作为哈希的第i个元素。
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.
}
答案 0 :(得分: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);
答案 1 :(得分:2)
要取消引用哈希,请使用%{ ... }
:
print %{ $myarray[$i] }, "\n";
这可能仍然没有做你想要的。要很好地打印哈希,你必须迭代它,没有“漂亮”的字符串化:
print $_, ':', $myarray[$i]{$_}, "\n" for keys %{ $myarray[$i] };