次のコードが無名配列を取得する際に機能しないのはなぜですか?
my @d = [3,5,7];
print $(@{$d[0]}[0]);
# but print $d[0][0] works.
無効な Perl コードだからですか?
#!/usr/bin/env perl
use strict;
use warnings;
my @d = [3,5,7];
print $(@{$d[0]}[0]);
perl -c
Perl 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 も同様です。
コードを次のように変更すると、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";
#!/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]
角かっこのコンストラクターは匿名配列を作成しますが、それを別の配列に格納しています。これは、1 要素配列の最初の要素内に 3 要素配列を格納していることを意味します。$d[0][0]
これがが value を返す理由です3
。単一レベルの配列を行うには、リスト コンストラクターを使用します。
my @d = (3,5,7);
print $d[0];
外側の配列内に配列を作成することを本当に意図している場合は、単一の (スカラー) 値を次のように逆参照する必要があります。
print ${$d[0]}[0].
詳しくは をお読みくださいperldoc perlreftut
。