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

2 回答 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";
}

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

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

my $copy = {};
%{$copy} = %{$myarray[$i]};
push (@modifymyhash, $copy);
于 2013-03-19T21:01:16.447 回答
2

要取消引用哈希,请使用%{ ... }

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

这可能仍然不能满足您的要求。要很好地打印散列,您必须对其进行迭代,没有“好的”字符串化:

print $_, ':', $myarray[$i]{$_}, "\n" for keys %{ $myarray[$i] };
于 2013-03-19T21:02:11.567 回答