为什么我可以打印这种治疗作为参考并将其视为标量?

Cra*_*lus 5 arrays perl scalar reference

在以下perl片段中:

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

my @a2d = (  
    $a1,  
    $b1,  
    $c1  
);  
Run Code Online (Sandbox Code Playgroud)

@a2d是一个包含对数组的引用的数组.
我的问题是为什么以下打印相同的东西(musical)?:

print ${$a2d[0]}[2],"\n";  
print $a2d[0][2],"\n";  
Run Code Online (Sandbox Code Playgroud)

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

amo*_*mon 10

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

my $ref = $a2d[0];
say ${ $ref }[2];
say $ref->[2];
Run Code Online (Sandbox Code Playgroud)

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

say ${ $a2d[0] }[2];
say $a2d[0]->[2];
Run Code Online (Sandbox Code Playgroud)

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

say $a2d[0][2];
Run Code Online (Sandbox Code Playgroud)

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

这也在perlreftut中进行了解释,它更深入地考虑了这些因素.阅读该文件应该清除许多问题.


ike*_*ami 9

当您使用索引时,隐含了取消引用.

$a2d[0][2]
Run Code Online (Sandbox Code Playgroud)

是的缩写

${ $a2d[0] }[2]
Run Code Online (Sandbox Code Playgroud)

又名

$a2d[0]->[2]
Run Code Online (Sandbox Code Playgroud)

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

其他例子:$aoa[$i][$j],$aoh[$i]{$k},$hoa{$k}[$i]$hoh{$k1}{$k2}.