Go to the first, previous, next, last section, table of contents.

参照渡し

サブルーチンへ配列の値を渡すのではなく、 その名前を渡して、サブルーチンがローカルなコピーに対してではなく グローバルな配列を変更できるようにしたい時があるだろう。

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] への明示的な参照を行うことで 変更を行うことが可能である。 配列の全要素をスカラー値として渡すことで配列要素の変更は可能であるが、 pushpop や配列の大きさを変える操作には、 *メカニズムを使わなければならない。 *メカニズムはどのような場合でも効率がよりよいだろう。

*name の値は出力不可能なバイナリデータを含むので、 printprintfsprintf%s への引数として用いると 出力をきれいに行うため、`*name' という値になる。

配列を変更したくない場合でも、 このメカニズムは複数の配列を一つのリストで渡すのに便利である。 なぜなら、通常、リストメカニズムは全配列値を一つにマージするため、 それを個々の配列に分けることができないからである。


Go to the first, previous, next, last section, table of contents.