5

在以下 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 或给出错误,因为数组的元素是参考

4

2 回答 2

10

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

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

这些形式是等价的。现在,我们可以去掉那个中间变量,得到:

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

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

say $a2d[0][2];

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

这在perlreftut中也有解释中进行了解释,它更深入地讨论了这些考虑。阅读该文件应该可以解决许多问题。

于 2013-10-12T21:43:07.827 回答
9

当您添加索引时,会隐含取消引用。

$a2d[0][2]

简称

${ $a2d[0] }[2]

又名

$a2d[0]->[2]

Perl 没有给出语法错误,而是为常见操作提供了一个有用的快捷方式。

其他示例:$aoa[$i][$j]$aoh[$i]{$k}和。$hoa{$k}[$i]$hoh{$k1}{$k2}

于 2013-10-12T21:42:33.890 回答