-1

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

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

   # but print $d[0][0] works.
4

3 回答 3

7

脚本 1(原始)

因为它是无效的 Perl 代码?

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

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

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.

坦率地说,我不确定你为什么期望它起作用。我无法对你试图做的事情做出判断。

替代方案:

print $d[0][0];

工作正常,因为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";

问题

所以$in$d[0]表示[3,5,7]对 array 取消引用(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";

输出

ARRAY(0x100802eb8), ARRAY(0x100826d18), 
ARRAY(0x100802eb8), 
3, 5, 7, 
4, 6, 8, 
3, 
6, 
3, 
6, 
于 2012-04-21T00:36:44.240 回答
6

我认为您正在为此尝试:

${$d[0]}[0]

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

$d[0]->[0]
于 2012-04-21T00:36:05.003 回答
3

方括号构造函数创建一个匿名数组,但您将它存储在另一个数组中。这意味着您将三元素数组存储在一个元素数组的第一个元素中。这就是为什么$d[0][0]会返回值3。要执行单级数组,请使用列表构造函数:

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

如果您真的打算在外部数组中创建数组,那么您应该取消引用单个(标量)值作为

print ${$d[0]}[0].

更多阅读perldoc perlreftut

于 2012-04-21T00:37:15.270 回答