多くの人がここですでに正しい答えを出しています。わかりやすい例を追加したいと思いました。詳細については、 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];
}
構文よりも矢印演算子を使用する方が望ましいと思い$$ます。