サブルーチンへ配列の値を渡すのではなく、 その名前を渡して、サブルーチンがローカルなコピーに対してではなく グローバルな配列を変更できるようにしたい時があるだろう。
perl では名前を持つ全てのオブジェクトに対して、
その名前の前に *
をつけることで参照することができる: *foo
。
これが評価されると、その名前を持つ、
ファイルハンドル・フォーマット・サブルーチンを含む
全オブジェクトを表すスカラー値となる。
local()
演算内で代入を行うと、
その名前がそれに代入された *
値 を参照するようになる。例えば、
sub doubleary { local(*someary) = @_; foreach $elem (@someary) { $elem *= 2; } } do doubleary(*foo); do doubleary(*bar);
*name
への代入は
現在のところ local()
の場合しかお勧めできない。
実際のところ、*name
への代入はどこでもできるのだが、
以前に行った *name
への参照が永遠に尾を引く(may be stranded forever)
可能性がある。これは困ったことかもしれないし、そうでないかもしれない。
スカラー値は何もしなくても参照渡しである。
すなわち、このメカニズムを用いなくても、
関心のある $_[nnn]
への明示的な参照を行うことで
変更を行うことが可能である。
配列の全要素をスカラー値として渡すことで配列要素の変更は可能であるが、
push
、pop
や配列の大きさを変える操作には、
*
メカニズムを使わなければならない。
*
メカニズムはどのような場合でも効率がよりよいだろう。
*name
の値は出力不可能なバイナリデータを含むので、
print
や printf
、
sprintf
の %s
への引数として用いると
出力をきれいに行うため、`*name' という値になる。
配列を変更したくない場合でも、 このメカニズムは複数の配列を一つのリストで渡すのに便利である。 なぜなら、通常、リストメカニズムは全配列値を一つにマージするため、 それを個々の配列に分けることができないからである。