让我们说多维数组就是这样,
$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
实际上是引用而不是数组)。
答案 0 :(得分:4)
第一和第二个示例在功能上是等效的。一个只是另一种的语法糖。
第三个在语义上有所不同。尽管在索引之间省略->
运算符是可以接受的,但是如果变量(或子例程)包含(或返回)引用,则在标识符或子例程调用与索引之间不这样做是不可接受的,因为Perl会将其视为在这种情况下没有引用。
在任何情况下,$array->[1][2]
都不代表$array->[1]->[2]
,但是如果允许省略标识符和第一个索引之间的箭头,则结构是否不确定被索引为[1,...]
或(1,...)
,它们是不同的东西。
答案 1 :(得分:3)
三分
所有引用均以标量保存,因此所有引用均以$
开头的变量保存。
[ ... ]
创建了一个匿名数组引用,因此[ [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
完全没有联系。