如何在Perl中访问哈希数组?

6

我有一个大的哈希数组,我想从数组中抓取一些哈希并插入到新数组中,而不改变第一个数组。我遇到了将哈希推入数组的问题,我该如何访问第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.
 }
2个回答

14

首先,您应该

use strict;
use warnings;

然后定义。
my $my_hash;

在分配值之前,初始化$my_hash,否则您将覆盖它,并且所有三个元素都指向同一个哈希。
$my_hash = {};

最后,要访问哈希成员

$myarray[$i]->{firstname}

要打印整个哈希表,可以使用Data::Dumper等工具。
print Dumper($myarray[$i])."\n";

或使用其他方法,如何在Perl中打印哈希表的内容?如何在Perl中打印哈希结构?

更新你的评论:

你可以通过复制哈希表来实现。

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

将元素复制到新数组中,效果完美。您可以使用验证。
foreach my $h (@myarray) {
    print Dumper($h), "\n";
}

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

这两个数组具有相同的哈希值。

如果你想要进行深度复制,而不仅仅是引用,你可以分配一个新的哈希,并将第 i 个元素复制到副本中。然后将该副本存储在 @modifymyhash 中。

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

我已经同时使用了 string 和 warnings。我也已经初始化和定义了 my_hash。我想将整个哈希推入新数组。无论如何,谢谢。 - mysteriousboy
1
@mysteriousboy,你已经将哈希值推入@modifymyhash中了。有什么问题吗? - Olaf Dietsche

2
要解引用哈希表,请使用%{ ... }
print  %{ $myarray[$i] }, "\n";

这可能仍然不能满足您的要求。要将哈希值漂亮地打印出来,您需要对其进行迭代,因为没有“漂亮”的字符串化方式。
print $_, ':', $myarray[$i]{$_}, "\n" for keys %{ $myarray[$i] };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接