假设多维数组是这样的,
$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条答案
按热度按时间byqmnocz1#
第一个和第二个例子在功能上是等价的,一个只是另一个的句法糖。
第三种在语义上不同,虽然在索引之间省略
->
操作符是可以接受的,但如果变量(或子例程)包含(或返回)引用,则在标识符或子例程调用与索引之间这样做是不可接受的,因为在这种情况下Perl会将它们视为非引用。不存在
$array->[1][2]
可以表示除$array->[1]->[2]
之外的任何内容的情况,但是如果允许省略标识符和第一个索引之间的箭头,则关于被索引到的结构是否看起来像[1,...]
或(1,...)
将是不明确的,这是不同的事情。u0njafvf2#
三点
$myarray
保存的是数组引用,而不是数组。$myarray
和@myarray
是不同的变量所有引用都保存在标量中,因此所有引用都保存在以
$
开头的变量中。[ ... ]
创建了一个匿名数组引用,因此[ [1, 2, 3], [4, 5, 6], [7, 8, 9]]
创建了一个包含3个匿名数组引用的匿名数组引用,每个匿名数组引用包含3个标量。这意味着对
$myarray
的赋值是将外部匿名数组引用赋给它。为了访问一个引用指向的东西,你需要解引用它,你可以把引用指向的类型的符号放在引用前面,比如
@$myarray
,所以$$myarray[0]
是匿名数组的第一个元素,保存在引用$myarray
中,或者你可以使用间接语法$myarray->[0]
.在你的例子中,
$myarray->[0]
保存了数组引用,所以这可以用同样的方法解引用,给$myarray->[0]->[0]
,这就是解引用$myarray
,给予我第一个元素,这是数组引用,然后解引用它,给我第一个元素。这是你的第二个例子。
Perl允许你把
->
放在]
和[
之间,以及}
和{
之间,作为语法上的糖衣,这是你的第一个例子$myarray->[0][0]
。第三个例子是查找
@myarray
的第一个元素,它是与$myarray
不同的变量。如果您将use strict
放在脚本的顶部,Perl将为您捕获此错误。这是个好主意
作为任何Perl脚本或模块的前两行,因为它们会在程序中捕获大量的坏错误和潜在的致命错误。如果您正在调试程序,则在
use strict
下添加use diagnostics
会给出更详细的消息。nbnkbykc3#
$myarray->[1]
表示“使用存储在$myarray
中的数组引用在数组中查找索引1“。$myarray[1]
表示“在数组@myarray
中查找索引1“。两个变量
$myarray
和@myarray
根本没有联系。