在以下perl片段中:

my $a1 = [ qw(rock pop musical) ];
my $b1 = [ qw( mystery action drama )];
my $c1 = [ qw( biography novel periodical)];

my @a2d = (
    $a1,
    $b1,
    $c1
);


@a2d是一个数组,其中包含对数组的引用。
我的问题是为什么以下内容打印相同的内容(musical)?:

print ${$a2d[0]}[2],"\n";
print $a2d[0][2],"\n";


我期望第二个打印ARRAY或给出错误,因为数组的元素是引用

最佳答案

$a2d[0]是数组引用。我们可以获取此数组引用并打印出第三个条目:

my $ref = $a2d[0];
say ${ $ref }[2];
say $ref->[2];


这些形式是等效的。现在,我们可以取消该中间变量,并获得:

say ${ $a2d[0] }[2];
say $a2d[0]->[2];


如果取消引用运算符->出现在两个下标之间,则可以将其省略为快捷方式:

say $a2d[0][2];


当左下标为[...]{...},右下标为[...]{...}(...)时,可以省略箭头。

perlreftut中对此也进行了解释,其中更深入地介绍了这些注意事项。阅读该文档应清除许多问题。

07-28 10:41