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


シンボルテーブルのエントリを渡す

[注意:この節で記述する機能は Perl 5 でもちゃんと動作しますが、一般的には 新規に追加されたリファレンス機能の方が扱いやすいでしょう。 See section リファレンスとデータ構造のネスト, を参照してください。]

配列のローカルなものではなく、グローバルなものの変更ができるように、配列 の値ではなく、名前を渡したいようなことがあるでしょう。Perl では、名前の 前にアスタリスクをつけて、`*foo' のようにして、特定の名前のすべての オブジェクトを参照することができます。先頭のアスタリスクは、変数やサブルー ティンに付ける記号すべてにマッチする、ワイルドカードのように考えることが できますから、よく「型グロブ」とよばれます。

型グロブは評価されると、その名前のすべてのオブジェクト (これには、ファイ ルハンドル、フォーマット、サブルーティンなども含まれます) を参照するスカ ラ値となります。代入されると、指定された名前で、"*" 値に代入されたものを 参照するようになります。例:

sub doubleary {
    local(*someary) = @_;
    foreach $elem (@someary) {
        $elem *= 2;
    }
}
doubleary(*foo);
doubleary(*bar);

スカラ値は、サブルーティンに対して、すでにリファレンスとして渡されていま すから、この機能を使わなくても、明示的に $_[0]などを参照して、スカラ引数 を修正することができます。配列の要素をすべてスカラとして渡すことで、その 全部の要素を変更することができますが、pushpop や配列の大 きさを変えるなどの操作には、* の機能 (あるいは同等のリファレンスの機能) を使う必要があります。型グロブ (やリファレンス) を渡す方が確実に速くなり ます。

配列を変更したい場合でなくても、1 つの LIST のなかで、複数の配列を渡した いときなどに、この方法が役に立ちます。通常は、LIST のしくみによって、配 列の値がつなげられていまうので、配列を個々に取り出すことができなくなって しまうからです。


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

検索式: