我有一个perl脚本,我们将Hash转换为数组 -
my %info = (
'name' => $1,
'ip' => $2,
'parent' => '',
'isLocal' => 0,
'clip' => 0,
);
my @siteinfos = ();
push( @siteinfos, \%info );
现在我可以通过 -
访问数组了foreach my $site(@siteinfos) {
if ( $site->{'name'} eq $sitename) {
.....
}
首先我不确定这种转换是如何工作的。其次,现在我想以(key,pair)格式向这个数组中添加更多元素。我该怎么办?
答案 0 :(得分:7)
首先,没有转换。
my @siteinfos = ();
定义数组@siteinfos
并设置为空列表。当然,只需使用
my @siteinfos;
接下来,声明
push( @siteinfos, \%info );
将对哈希%info
的引用推送到@siteinfos
作为该数组的唯一元素。
接下来,循环
foreach my $sinfo (@siteinfos) { # assuming original is a typo
最终将$sinfo
别名化为@siteinfos
中唯一的哈希引用。在循环体中,您可以通过推送到@siteinfos
的引用访问原始哈希的元素。
现在,如果你做完了,事情会有所不同:
push @siteinfos, %info;
那会将@siteinfos
设置为如下列表(顺序是非确定性的):
$VAR1 = [
'ip',
undef,
'clip',
0,
'isLocal',
0,
'name',
undef,
'parent',
''
];
undef
存在,因为运行脚本时匹配变量为空。现在,如果你想将另一个键值对推送到这个数组,这是微不足道的:
push @siteinfos, $key, $value;
但是,当然,通过将哈希值分配给数组,您将无法通过键简单地查找值。此外,您可以继续将重复键推送到数组,但如果将其分配回另一个哈希:
my %otherinfo = @siteinfos;
然后只有偶数索引元素(键)的最后一个版本及其相应的奇数索引元素(值)才能存活。
答案 1 :(得分:5)
您不转换任何内容。您正在创建一个名为@siteinfos
的新数组。
my @siteinfos = ();
然后添加一个条目,这是对哈希%info
的引用。
push( @siteinfos, \%info );
现在,数组包含对%info
的引用。那是$siteinfo[0]
。
在循环中,您迭代@siteinfos
中的所有元素。 hashref现在进入$sinfo
。
如果要向该hashref添加更多键和值,只需将它们放入。
foreach my $sinfo (@siteinfos) {
if ( $sinfo->{'name'} eq $sitename) {
$sinfo->{foo} = "bar"; # as simple as this
}
}