-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 -cPerl 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は単一の配列参照を含む配列であるため、正常に動作します。したがって$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は、が array に逆参照されている$d[0]ことを示していますか、それともここで何をしているのでしょうか? スカラーが出力されていることを示すためだと思いましたか?[3,5,7](3,5,7)$$

大雑把に言えば、参照はスカラーですが、特別な種類のスカラーです。

すると、配列への参照であることを示す のprint "$d[0]\n";ような出力が得られます。2 番目の添字は、別のレベルの逆参照が行われていることを示す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

角かっこのコンストラクターは匿名配列を作成しますが、それを別の配列に格納しています。これは、1 要素配列の最初の要素内に 3 要素配列を格納していることを意味します。$d[0][0]これがが value を返す理由です3。単一レベルの配列を行うには、リスト コンストラクターを使用します。

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

外側の配列内に配列を作成することを本当に意図している場合は、単一の (スカラー) 値を次のように逆参照する必要があります。

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

詳しくは をお読みくださいperldoc perlreftut

于 2012-04-21T00:37:15.270 に答える