Perl:解除引用数组

Sam*_*msh -1 arrays perl reference

为什么以下代码无法进入匿名数组?

   my @d = [3,5,7];
   print $(@{$d[0]}[0]);  

   # but print $d[0][0] works.
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 7

脚本1(原创)

因为它是无效的Perl代码?

#!/usr/bin/env perl
use strict;
use warnings;

my @d = [3,5,7];
print $(@{$d[0]}[0]); 
Run Code Online (Sandbox Code Playgroud)

perl -c使用Perl 5.14.1 编译()时,它产生:

Array found where operator expected at xx.pl line 6, at end of line
    (Missing operator before ?)
syntax error at xx.pl line 6, near "])"
xx.pl had compilation errors.
Run Code Online (Sandbox Code Playgroud)

坦率地说,我不确定你为什么期望它能起作用.我不能做你想要做的事情的头或尾.

替代方案:

print $d[0][0];
Run Code Online (Sandbox Code Playgroud)

工作正常,因为d是一个包含单个数组ref的数组.因此$d[0]是数组(3, 5, 7)(注意括号而不是方括号),因此$d[0][0]是数组的第0个元素,即3.

脚本2

您对代码的修改打印3和6:

#!/usr/bin/env perl
use strict;
use warnings;

my @d = ( [3,5,7], [4,6,8] );
print $d[0][0], "\n";
print $d[1][1], "\n";
Run Code Online (Sandbox Code Playgroud)

所以$in $d[0]表示[3,5,7]该数组被解除引用(3,5,7),或者$这里做了什么?我以为这$表明标量是打印出来的?

粗略地说,引用是一个标量,但是一种特殊的标量.

如果你print "$d[0]\n";得到类似的输出ARRAY(0x100802eb8),表明它是对数组的引用.第二个下标也可以写成$d[0]->[0]表示还有另一级别的解除引用.您也可以编写print @{$d[0]}, "\n";以打印出数组中的所有元素.

脚本3

#!/usr/bin/env perl
use strict;
use warnings;

$, = ", ";

my @d = ( [3,5,7], [4,6,8] );
#print $(@{$d[0]}[0]); 
print @d, "\n";
print $d[0], "\n";
print @{$d[0]}, "\n";
print @{$d[1]}, "\n";
print $d[0][0], "\n";
print $d[1][1], "\n";
print $d[0]->[0], "\n";
print $d[1]->[1], "\n";
Run Code Online (Sandbox Code Playgroud)

产量

ARRAY(0x100802eb8), ARRAY(0x100826d18), 
ARRAY(0x100802eb8), 
3, 5, 7, 
4, 6, 8, 
3, 
6, 
3, 
6, 
Run Code Online (Sandbox Code Playgroud)


jwd*_*jwd 6

我想你正在努力:

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

虽然当然总是有语法糖方式:

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

  • @Sam Adams:正如其他答案所讨论的那样,你的`@ d`数组里面只有一个*single*条目 - 对你的`1,2,3`数组的引用.所以代码的`$ d [0]`部分得到了引用,而`$ {...} [0]`部分访问引用数组中的第0个元素.合理? (2认同)