我有一个perl脚本,我们将哈希转换为数组 -
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)格式向这个数组中添加更多元素.我该怎么做?
首先,没有转换.
my @siteinfos = ();
定义一个数组@siteinfos
并设置为空列表.当然,你可以通过使用just获得相同的结果
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;
那么只有偶数索引元素(键)的最后一个版本及其相应的奇数索引元素(值)才能存活.
你没有转换任何东西.您正在创建一个名为的新数组@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 } }