我们如何正确地将数组推入数组,然后检索每个外部数组(解释两者要求的每个清楚地分开)?
插图
my @f; my @e;
for $i (0..40) {
@e=($i+=2, $i+1);
push(@f,@e); # just it right ?
}
# how go on get it under multi array control
Run Code Online (Sandbox Code Playgroud)
Data::Dumper是探索这里发生的事情的好工具。它可以轻松可视化您的数据结构。
如果我们运行您的代码,然后@f使用 Data::Dumper 显示,我们会得到:
$VAR1 = [
2,
3,
3,
4,
4,
5,
5,
6,
6,
[ ... snip ... ]
40,
40,
41,
41,
42,
42,
43
];
Run Code Online (Sandbox Code Playgroud)
所以这不是做你想做的事。如果将一个数组压入另一个数组,Perl 只会将第二个数组中的每个元素添加到第一个数组的末尾。无法判断哪个元素属于哪个数组。这称为“阵列扁平化”。
发生这种情况是因为数组中的元素只能保存单个标量值。另一个数组不是标量值。但我们可以引用一个数组,然后它就是一个标量值。您可以使用 获得对数组的引用\。
对代码的更改很简单:
my @e=($i+=2, $i+1); # declare @e inside the loop
push(@f,\@e); # Take a reference
Run Code Online (Sandbox Code Playgroud)
我们现在得到的输出是:
$VAR1 = [
[
2,
3
],
[
3,
4
],
[
4,
5
],
[ ... snip ... ]
[
39,
40
],
[
40,
41
],
[
41,
42
],
[
42,
43
]
];
Run Code Online (Sandbox Code Playgroud)
您可以清楚地看到主阵列内的各个“子阵列”。
perllol手册页中有更多关于此内容的信息,您可以在perlreftut和perlref中找到有关参考的更多信息。