1

我遵循了两个用 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

4 回答 4

6

这很简单。$mr是参考。所以你使用Arrow Operatorto 取消引用。

此外,如果您使用use warnings; use strict;,您会收到一条明显的错误消息:

Global symbol "@mr" requires explicit package name
于 2013-07-11T07:49:37.303 回答
3

$mr是一个标量变量,其值是对列表的引用。它不是列表,也不能像列表一样使用。需要箭头才能访问它所引用的列表。

但是等等,$m1[0]也不是一个列表,而是一个参考。您可能想知道为什么不必在索引之间写一个箭头,例如$m1[0]->[1]. 有一条特殊规则规定,在访问列表或引用哈希中的列表或哈希元素时,您可以$mr->[0][1]省略箭头,因此您可以编写代替$mr->[0]->[1]$m1[0][1]代替$m1[0]->[1].

于 2013-07-11T07:41:58.267 回答
0

You said:

print "$m1[0][1]\n"; # this statement outputs: 2; that is expected.

print "$mr[0][1]\n"; #this statement doesn't output anything.

Notice how you used the same syntax both times.

As you've established by this first line, this syntax accesses the array named: @m1 and @mr. You have no variable named @mr, so you get undef for $mr[0][1].

Maybe you don't realizes that scalar $mr and array @mr have no relation to each other.

Please use use strict; use warnings; to avoid these and many other errors.

于 2013-07-11T11:09:05.880 回答
0

$mr持有一个引用(概念上类似于编译语言中变量的地址)。因此你有一个额外的间接级别。替换$mr$$mr,你会没事的。

顺便说一句,您可以通过浏览perldoc 上的教程轻松检查此类问题。

于 2013-07-11T07:49:36.253 回答