簡體   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