2017-01-17 27 views
-4

创建我有一个Perl脚本,我们正在将散列到阵列 -的Perl:添加更多的元素阵列从哈希

my %info = (
      'name' => $1, 
      'ip'  => $2, 
      'parent' => '', 
      'isLocal' => 0, 
      'clip' => 0, 
     ); 
my @siteinfos =(); 
push(@siteinfos, \%info); 

现在我能够accesss数组副

foreach my $site(@siteinfos) { 
if ($site->{'name'} eq $sitename) { 
..... 
} 

首先我不确定这个转换实际上是如何工作的。其次,现在我想以(key,pair)格式向这个数组添加更多的元素。我该怎么做?

+1

的可能的复制。[Perl的:数组和散列(http://stackoverflow.com/questions/40049853/perl-array-and-hash) – cxw

+0

...除此之外(请参阅[本答案](http://stackoverflow.com/a/40050190/2877364)),请尝试[此问题](https:// stackoverflow.com/q/32771192/2877364)。 – cxw

+1

'sinfos' var来自哪里? – 123

回答

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; 

则仅偶数索引的元素的最后一个版本(键)及其相应的奇数索引元素(价值)将生存。

+0

我们不仅有相同的答案,我们甚至用相同的方式来设置它的格式。 :D – simbabque

+0

@simbabque如果您想将我的答案的第二部分结合起来,将更多键值对推送到数组中,我会删除我的。 –

+1

Nonono,你的T恤只需要5K的代表。 ;)今年夏天,我们都可以在阿姆斯特丹的YAPC :: EU举办一场Stack Overflow T恤派对。 – simbabque

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