我遵循以perl编写的两个陈述:
@m1 = ( [1,2,3],[4,5,6],[7,8,9] ); # It is an array of references.
$mr = [ [1,2,3],[4,5,6],[7,8,9] ]; # It is an anonymous array. $mr holds reference.
当我尝试print
时:
print "$m1[0][1]\n"; # this statement outputs: 2; that is expected.
print "$mr->[0][1]\n"; #this statement outputs: 2; that is expected.
print "$mr[0][1]\n"; #this statement doesn't output anything.
我觉得第二和第三个印刷语句是相同的。但是,我没有输出第三个打印声明。
任何人都可以让我知道第三次印刷声明有什么问题吗?
答案 0 :(得分:6)
这很简单。 $mr
是一个参考。因此,您使用Arrow Operator
取消引用。
此外,如果你使用use warnings; use strict;
,你会收到一个明显的错误信息:
Global symbol "@mr" requires explicit package name
答案 1 :(得分:2)
$mr
是一个标量变量,其值是对列表的引用。它不是列表,也不能用作列表。需要箭头才能访问它所引用的列表。
但是等一下,$m1[0]
也不是一个列表,而是一个列表的引用。您可能想知道为什么不必在索引之间编写箭头,例如$m1[0]->[1]
。有a special rule表示您在访问列表或引用哈希中的列表或哈希元素时可以省略箭头,因此您可以编写$mr->[0][1]
而不是$mr->[0]->[1]
和$m1[0][1]
代替$m1[0]->[1]
。
答案 2 :(得分:0)
$mr
包含一个引用(概念上类似于编译语言中变量的地址)。因此你有一个额外的间接水平。将$mr
替换为$$mr
,您就可以了。
顺便说一句,您可以通过浏览tutorials on perldoc轻松查看这些问题。
答案 3 :(得分:0)
你说:
print "$m1[0][1]\n"; # this statement outputs: 2; that is expected.
print "$mr[0][1]\n"; #this statement doesn't output anything.
注意你两次使用相同的语法。
正如您在第一行中建立的那样,此语法访问名为@m1
和@mr
的数组。您没有名为@mr
的变量,因此您为$mr[0][1]
获得了undef。
也许你没有意识到标量$mr
和数组@mr
彼此没有关系。
请使用use strict; use warnings;
来避免这些和其他许多错误。