多くの人がここですでに正しい答えを出しています。わかりやすい例を追加したいと思いました。詳細については、 perldoc perlrefのドキュメントを参照してください。
あなたの問題はあいまいさの1つであり、2つの操作が$$
あり[0]
、同じ識別子に取り組んで_
おり、結果はどちらの操作が最初に実行されるかによって異なります。サポート中かっこを使用することで、あいまいさを軽減できます${ ... }
。$$_[0]
(とにかく人間にとって)おそらく次のことを意味します:
${$$_}[0]
-- スカラー$_
を逆参照し、最初の要素を取得します。
${$_[0]}
--0
配列の要素を取得@_
し、逆参照します。
ご覧のとおり、これら 2 つのケースはまったく異なる変数を参照して@_
おり、$_
.
もちろん、Perl の場合はあいまいではありません。逆参照はキー ルックアップの前に実行されるため、単純に最初のオプションを取得します。この逆参照をオーバーライドするには、サポート中括弧が必要です。そのため、サポート中括弧なしでは例が「機能」しません。
サブルーチンの混乱を少し軽減する機能を検討することもできます。2 つのことを一度に行う (引数を取得して逆参照する) のではなく、2 段階で行うことができます。
sub foo {
my $n = shift;
print $$n;
}
ここでは、最初の引数を@_
で取り除きshift
、逆参照します。クリーンでシンプル。
ただし、ほとんどの場合、スカラー変数への参照は使用しません。そのような場合、矢印演算子を利用できます->
my @array = (1,2,3);
foo(\@array);
sub foo {
my $aref = shift;
print $aref->[0];
}
構文よりも矢印演算子を使用する方が望ましいと思い$$
ます。