关于在perl中使用箭头符号的问题

时间:2013-07-11 07:35:34

标签: perl reference

我遵循以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.

我觉得第二和第三个印刷语句是相同的。但是,我没有输出第三个打印声明。

任何人都可以让我知道第三次印刷声明有什么问题吗?

4 个答案:

答案 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;来避免这些和其他许多错误。