为什么以下代码无法进入匿名数组?
my @d = [3,5,7];
print $(@{$d[0]}[0]);
# but print $d[0][0] works.
答案 0 :(得分:7)
因为它是无效的Perl代码吗?
#!/usr/bin/env perl
use strict;
use warnings;
my @d = [3,5,7];
print $(@{$d[0]}[0]);
使用Perl 5.14.1编译(perl -c
)时,它会产生:
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。
您的代码修改打印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";
因此
$
中的$d[0]
表示[3,5,7]
已取消引用数组(3,5,7)
,或$
在此处执行了什么操作?我以为$
表示标量是打印出来的?
粗略地说,引用是一个标量,但是一种特殊的标量。
如果执行print "$d[0]\n";
,则会得到ARRAY(0x100802eb8)
之类的输出,表明它是对数组的引用。第二个下标也可以写成$d[0]->[0]
,表示还有另一级别的解除引用。您也可以编写print @{$d[0]}, "\n";
来打印出数组中的所有元素。
#!/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,
答案 1 :(得分:6)
我认为你正在努力:
${$d[0]}[0]
虽然当然总有语法糖方式:
$d[0]->[0]
答案 2 :(得分:2)
方括号构造函数创建一个匿名数组,但是您将它存储在另一个数组中。这意味着您将三个元素数组存储在一个元素数组的第一个元素中。这就是$d[0][0]
将返回值3
的原因。要执行单级数组,请使用列表构造函数:
my @d = (3,5,7);
print $d[0];
如果你真的想在外部数组中创建数组,那么你应该将单个(标量)值取消引用为
print ${$d[0]}[0].
更多阅读perldoc perlreftut
。