5

次の perl スニペットでは:

my $a1 = [ qw(rock pop musical) ];  
my $b1 = [ qw( mystery action drama )];  
my $c1 = [ qw( biography novel periodical)];  

my @a2d = (  
    $a1,  
    $b1,  
    $c1  
);  

は、配列への@a2d参照を含む配列です。
私の質問は、次のものが同じものを出力する理由です ( musical)?:

print ${$a2d[0]}[2],"\n";  
print $a2d[0][2],"\n";  

配列の要素は参照であるため、2番目にARRAYを出力するか、エラーが発生することを期待していました

4

2 に答える 2

10

$a2d[0]配列参照です。この配列参照を取得して、3 番目のエントリを出力できます。

my $ref = $a2d[0];
say ${ $ref }[2];
say $ref->[2];

これらの形式は同等です。これで、その中間変数を廃止して、次を取得できます。

say ${ $a2d[0] }[2];
say $a2d[0]->[2];

逆参照演算子->が 2 つの添え字の間にある場合は、ショートカットとして省略できます。

say $a2d[0][2];

[...]左添え字がor{...}で、[...]右添え字が{...}orの場合、矢印は省略できます(...)

これはperlreftutでも説明されており、これらの考慮事項をより深く掘り下げています。そのドキュメントを読めば、多くの疑問が解決するはずです。

于 2013-10-12T21:43:07.827 に答える
9

インデックスを追加すると、間接参照が暗示されます。

$a2d[0][2]

の略です

${ $a2d[0] }[2]

別名

$a2d[0]->[2]

Perl では、構文エラーが発生するのではなく、一般的な操作の便利なショートカットが提供されます。

その他の例: $aoa[$i][$j]$aoh[$i]{$k}$hoa{$k}[$i]および$hoh{$k1}{$k2}

于 2013-10-12T21:42:33.890 に答える