perl - 理解数组数组的麻烦

时间:2011-02-10 04:12:30

标签: arrays perl multidimensional-array

我正在尝试创建一个数组数组,然后引用它们。

我做了一些像:

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]如何不同?

2 个答案:

答案 0 :(得分:4)

实际上不需要第二个->

这是交易:所有Perl数组值和哈希值必须是标量。这意味着字符串,数字或数组/哈希引用(而不是普通的旧数组或哈希)。

因此第一个->运算符取消引用数组并获取第x行。在那里 - 不是数组,而是数组引用。所以为了获得那里的数据,你理论上需要另一个->运算符。

但是得到这个。 Perl很聪明:它知道在一次数组或散列访问之后,如果发生另一次访问,唯一可行的方法是通过数组/哈希引用(因为你的第一个数组/哈希访问必须返回一个标量)!所以你毕竟不需要第二个箭头。

有关详细信息,请参阅perldata

答案 1 :(得分:2)

当你

push @array, [@row];

您正在将引用推送到数组。这是必要的,因为Perl的规则是数组被展平。所以$ array-&gt; [x]是对行数组的引用,而不是对行数组本身的引用。但是,在下标之间,箭头是可选的。因此$array->[x]->[y]$array->[x][y]完全相同(与${$array}[x][y]完全相同,等等。)

Perl reference tutorial

中对此进行了解释