Perl多维数组访问

时间:2019-01-18 16:18:22

标签: arrays perl

让我们说多维数组就是这样,

$myarray = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]];

尝试通过三种方式访问​​它,

print $myarray->[1][1] #prints 5
print $myarray->[1]->[1] #also prints 5
print $myarray[1][1] #prints nothing

我不知道第一种和第二种访问方式之间的区别。具体来说,第二个更明确,但第一个仍然有效。这就迫使我认为还有第三种更好的方法(我知道不会,因为myarray实际上是引用而不是数组)。

3 个答案:

答案 0 :(得分:4)

第一和第二个示例在功能上是等效的。一个只是另一种的语法糖。

第三个在语义上有所不同。尽管在索引之间省略->运算符是可以接受的,但是如果变量(或子例程)包含(或返回)引用,则在标识符或子例程调用与索引之间不这样做是不可接受的,因为Perl会将其视为在这种情况下没有引用。

在任何情况下,$array->[1][2]都不代表$array->[1]->[2],但是如果允许省略标识符和第一个索引之间的箭头,则结构是否不确定被索引为[1,...](1,...),它们是不同的东西。

答案 1 :(得分:3)

三分

  1. $ myarray保存的是数组引用,而不是数组。
  2. $ mayarray和@myarray是不同的变量
  3. Perl并不是真正的多维数组

所有引用均以标量保存,因此所有引用均以$开头的变量保存。

[ ... ]创建了一个匿名数组引用,因此[ [1, 2, 3], [4, 5, 6], [7, 8, 9]]正在创建一个包含3个匿名数组引用的匿名数组引用,每个匿名数组引用包含3个标量。

这意味着对$ myarray的分配正在为其分配外部匿名数组引用。

要使两个访问引用指向两个对象,您需要取消引用。您可以通过将引用所指向的类型的符号放置在引用的前面,例如@$myarray。因此,$$myarray[0]是引用$myarray中保留的匿名数组的第一个元素,或者您可以使用间接语法$myarray->[0]

在您的示例中,$myarray->[0]拥有数组引用[1,2,3],因此可以用相同的方式取消引用,给定$myarray->[0]->[0]这表示取消引用$myarray并给我第一个元素,它是一个数组引用,然后取消引用它,并给我第一个元素。

这是您的第二个例子。

Perl允许您将->放在][之间,并将}{放在匿名哈希之间,作为语法糖。这给出了$myarray->[0][0],这是您的第一个示例。

您的第三个示例正在寻找@myarray的第一个元素,该元素是与$myarray不同的变量。如果您将use strict放在脚本的顶部,Perl会为您捕获此错误。

放个好主意

use strict;
use warnings;

作为任何Perl脚本或模块的前两行,它们将在程序中捕获大量的错误和潜在的致命错误。如果要调试程序,则在use diagnostics下添加use strict会显示更多详细信息。

答案 2 :(得分:2)

$myarray->[1]的意思是“使用存储在$myarray中的数组引用在数组中查找索引1”。

$myarray[1]的意思是“在数组@myarray中查找索引1”。

两个变量$myarray@myarray完全没有联系。