繁体   English   中英

Perl:解引用数组

[英]Perl: Dereferencing Array

为什么以下代码在进入匿名数组时不起作用?

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

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

脚本1(原始)

因为它是无效的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是一个包含单个数组引用的数组,所以效果很好。 因此$d[0]是数组(3, 5, 7) (请注意括号而不是方括号),因此$d[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";

所以$$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";

输出量

ARRAY(0x100802eb8), ARRAY(0x100826d18), 
ARRAY(0x100802eb8), 
3, 5, 7, 
4, 6, 8, 
3, 
6, 
3, 
6, 

我认为您正在为此:

${$d[0]}[0]

尽管当然也总是有语法糖方式:

$d[0]->[0]

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

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

如果您真的要在外部数组中创建数组,则应将单个(标量)值取消引用为

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

有关更多信息,请阅读perldoc perlreftut

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM