【问题标题】:Perl: Adding more elements to array created from hashPerl:向从哈希创建的数组添加更多元素
【发布时间】:2017-01-17 23:02:35
【问题描述】:

我有一个 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) 格式向这个数组添加更多元素。我该怎么做?

【问题讨论】:

标签: arrays perl hash


【解决方案1】:

首先,没有转化。

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;

那么只有偶数索引元素(键)及其对应的奇数索引元素(值)的最后一个版本才能存在。

【讨论】:

  • 我们不仅有相同的答案,我们甚至使用相同的方式来格式化它。 :D
  • @simbabque 如果你想结合我关于将更多键值对推送到数组的答案的第二部分,我将删除我的。
  • Nonono,你的 T 恤只需要 5k 更多的代表。 ;) 今年夏天,我们都可以在阿姆斯特丹的 YAPC::EU 举办 Stack Overflow T 恤派对。
【解决方案2】:

没有转换任何内容。您正在创建一个名为 @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
    }
}

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 2011-05-08
    • 2011-04-20
    • 2016-05-19
    • 2015-04-30
    • 2021-12-09
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多