【问题标题】:Accessing Arrays in Perl hashes在 Perl 哈希中访问数组
【发布时间】:2013-10-11 05:17:09
【问题描述】:

我在 perl 散列中有一个数组,声明如下:

my %updatevars = (datapoints => []);

我稍后会尝试像这样向它添加元素:

push($updatevars{'datapoints'}, [$updatestart+$i, $bandwidth]);

我收到此错误:

要推送的 arg 1 的类型必须是 dirlist.pl 第 61 行“])”附近的数组(不是哈希元素)

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    哈希(和数组)只能包含标量。这就是为什么我们必须在其中引用数组(和哈希)。 $updatevars{datapoints} 包含对数组的引用。因此,您需要使用

    push @{ $updatevars{datapoints} }, [ $updatestart+$i, $bandwidth ];
    

    请注意,您的代码将在 5.14+ 上运行,因为 push 已更改为也接受引用。 (但是,此更改“被认为是高度实验性的”,因此您也应该在较新的版本中使用上述代码。)

    【讨论】:

      【解决方案2】:

      $updatevars{'datapoints'} 是一个数组引用,正如您分配的那样:[]push 将数组作为参数,而不是数组引用。所以你需要取消引用你的参考:

      push @{ $updatevars{'datapoints'} }, ...
      

      在 Perl v5.14 中,您可以使用参考,如文档中所述。但这听起来不像是推荐的做法。

      从 Perl 5.14 开始,“push”可以采用标量 EXPR,它必须 持有对 unblessed 数组的引用。论据将是 自动取消引用。 “推”的这一方面被认为是高度 实验性的。确切的行为可能会在未来版本中改变 Perl。

      【讨论】:

        【解决方案3】:

        试试这个:

        push @{$updatevars{'datapoints'}}, [$updatestart+$i, $bandwidth];
        

        由于push 接受一个数组,而$updatevars{'datapoints'} 是一个数组引用,因此您必须通过将@{} 放在前面来取消引用它。

        【讨论】:

          猜你喜欢
          • 2016-12-12
          • 1970-01-01
          • 2015-06-26
          • 2013-03-08
          • 2013-11-01
          • 2011-12-29
          • 2021-08-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多