我正在尝试创建一个数组数组,然后引用它们。
我做了一些像:
sub foobar
{
my @array;
my $i;
for ($i = 0; $i < 1000; $i=$i+1)
{
my @row;
$row[0] = $i;
$row[1] = foo($bar);
push @array , [@row];
}
return \@array;
}
我可以通过以下方式获取值:
$array->[x]->[y];
但是我不明白为什么第二个 - &gt;需要。 $ array-&gt; [x]我理解因为$ array是一个引用。但是不是$ array-&gt; [x]意味着是一个数组?为什么这不起作用:
my @notarray = $array->[x];
现在阵列到底是什么?因为它肯定不是一个包含$ i,foo($ bar)
的数组对于对数组的引用数组的引用,$ array-&gt; [x] - &gt; [y]如何不同?
答案 0 :(得分:4)
实际上不需要第二个->
。
这是交易:所有Perl数组值和哈希值必须是标量。这意味着字符串,数字或数组/哈希引用(而不是普通的旧数组或哈希)。
因此第一个->
运算符取消引用数组并获取第x行。在那里 - 不是数组,而是数组引用。所以为了获得那里的数据,你理论上需要另一个->
运算符。
但是得到这个。 Perl很聪明:它知道在一次数组或散列访问之后,如果发生另一次访问,唯一可行的方法是通过数组/哈希引用(因为你的第一个数组/哈希访问必须返回一个标量)!所以你毕竟不需要第二个箭头。
有关详细信息,请参阅perldata。
答案 1 :(得分:2)
当你
push @array, [@row];
您正在将引用推送到数组。这是必要的,因为Perl的规则是数组被展平。所以$ array-&gt; [x]是对行数组的引用,而不是对行数组本身的引用。但是,在下标之间,箭头是可选的。因此$array->[x]->[y]
与$array->[x][y]
完全相同(与${$array}[x][y]
完全相同,等等。)