在 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 中,让你的程序死掉。
另见perlref 和perlreftut。