【问题标题】:Perl push an element into an array that is inside of another arrayPerl 将一个元素推入另一个数组内部的数组中
【发布时间】:2020-02-27 08:21:46
【问题描述】:

我有一个数组(我们称之为 X)并且 X 包含数组。我想将一个元素(一个字符串)推送到 X 内部的一个数组中。 我已经尝试搜索了很长一段时间,但我发现的只是人们试图将数组推入其他数组中。

我尝试了以下代码:

push(@X[0],$element);

这给了我错误:

现在在 perlscript.pl 第 30 行禁止对标量进行实验性推送, “$element)”附近

我正在使用 perl 5 版本 26。

【问题讨论】:

标签: arrays perl


【解决方案1】:

在 Perl 中,数组不能包含其他数组。做多维数据结构,需要引用。

考虑这个例子。

use strict; use warnings;
use Data::Dumper;

my @inner = qw(a b c);
my @outer = (
    \@inner,         # reference to existing array
    [100, 200, 300], # new anonymous array reference
);

print Dumper \@outer;

打印出来

$VAR1 = [
          [
            'a',
            'b',
            'c'
          ],
          [
            100,
            200,
            300
          ]
        ];

你的外部数组就是这样,一个数组。但它里面的元素是对数组的引用。您可以引用现有数组,也可以创建一个新的匿名数组。

在转出结构进行调试时,请注意Data::Dumper 中的Dumper 也需要引用,因此我们使用与\ 相同的符号。

现在要通过其在@outer 中的位置向@inner 添加一个元素,您需要从@outer 中取出第一个元素。为此,印记会发生变化,因此您会得到$outer[0]。要将其传递给push,我们需要将其转换为数组。这称为解引用作为数组。

push @{ $outer[0] }, 'd';

当我们再次Dumper它时,我们得到

$VAR1 = [
          [
            'a',
            'b',
            'c',
            'd'
          ],
          [
            100,
            200,
            300
          ]
        ];

因为第一个元素是一个命名数组变量的引用,所以我们也可以直接对其进行操作。

push @inner, 'e';

这将改变@outer 中第一个元素的值,因为两者都引用(看看为什么它被称为引用?)到内存中的同一个东西。

$VAR1 = [
          [
            'a',
            'b',
            'c',
            'd',
            'e'
          ],
          [
            100,
            200,
            300
          ]
        ];

我们不能对第二个元素这样做,因为它一开始是一个匿名引用。


让我们看看你的警告。

现在在 perlscript.pl 第 30 行“$element)”附近禁止对标量进行实验性推送

在 Perl 5.20.0 push 上引用 was deprecated 因为它没有按预期工作,并开始发出警告。在 Perl 5.30.0 this was changed 和它 is now a fatal error 中,让你的程序死掉。

另见perlrefperlreftut

【讨论】:

    【解决方案2】:

    push 的语法是

    push ARRAY, LIST
    

    例如,

    push @a, $element;
    

    无论变量名出现在哪里,您都可以用一个评估为引用的块替换该名称。

    push @{ $X[0] }, $element;
    

    这就是你所需要的。

    【讨论】:

      【解决方案3】:

      我认为这可以满足您的要求:

      push @{ $X[0] }, $element;
      

      【讨论】:

        【解决方案4】:

        就像大家已经提到的那样,push @{ $X[0] }, $element;

        既然你说你使用的是v5.26,你也可以使用后缀解引用:

        push $X[0]->@*, $element;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-03
          • 2012-06-22
          • 1970-01-01
          • 2021-02-07
          • 1970-01-01
          • 2021-03-20
          • 1970-01-01
          相关资源
          最近更新 更多