PERLSUB(1)               USER COMMANDS                 PERLSUB(1)



NAME
     perlsub - Perl のサブルーティン

SYNOPSIS
     サブルーティンの宣言:

         sub NAME;      # 「前方」宣言
         sub NAME BLOCK # 宣言かつ定義

     サブルーティンのインポート:

         use PACKAGE qw(NAME1 NAME2 NAME3);

     サブルーティンの呼び出し:

         &NAME          # その時点の @_ をサブルーティンに渡す。
         &NAME(LIST);   # & 形式では、引数に括弧が必要。
         NAME(LIST);    # 括弧があるときには & はなくてもよい。
         NAME LIST;     # 宣言済み/インポート済みのとき括弧はなく
                        # てもよい。


DESCRIPTION
     サブルーティンに渡された引数は、配列 @_ (すなわち $_[0],
     $_[1], ...) として参照できます。 配列 @_ はローカルな配列で
     すが、その値は実際のスカラ引数へのリファレンスです。 サブル
     ーティンが返却する値は、最後に評価された値であり、リスト値で
     ある場合も、スカラ値である場合もあります。 これとは別に、
     return 文を使うと、返却する値を指定して、サブルーティンから
     抜けることができます。 ローカルな変数を作るには、perlfunc
     manpage の local() 演算子と my() 演算子を参照してください。

     サブルーティンは、"&" という記号を頭に付けて呼び出すことがで
     きます。 Perl 5 では、"&" はなくてもよく、宣言済みのときに
     は、括弧も省略できます。 (ただし、defined() や undef() の引
     数として使う場合のように、サブルーティンを名指しするときには
     "&" は省略できないことに気を付けてください。 また、サブルー
     ティン名や、&$subref() や &{$SUBREF}() 構造を使ったリファレ
     ンスでサブルーティンの間接呼び出しをするときにも省略できませ
     ん。 さらには、perlref manpage を参照してください。)

     例:

         sub MAX {
             my $max = pop(@_);
             foreach $foo (@_) {
                 $max = $foo if $max < $foo;
             }
             $max;
         }





Perl manpages Last change: Release 5.0 Patchlevel 00            1






PERLSUB(1)               USER COMMANDS                 PERLSUB(1)



         ...
         $bestday = &MAX($mon,$tue,$wed,$thu,$fri);

     例:

         # 空白で始まる行をつなげて、1 行入力する

         sub get_line {
             $thisline = $lookahead;
             LINE: while ($lookahead = <STDIN>) {
                 if ($lookahead =~ /^[ \t]/) {
                     $thisline .= $lookahead;
                 }
                 else {
                     last LINE;
                 }
             }
             $thisline;
         }

         $lookahead = <STDIN>;       # 最初の行を先読み
         while ($_ = get_line()) {
             ...
         }

     形式引数に名前を付けるには、ローカルリストへの配列代入を行な
     います:

         sub maybeset {
             my($key, $value) = @_;
             $foo{$key} = $value unless $foo{$key};
         }

     代入では値をコピーしますから、参照呼び出しのサブルーティン
     を値呼び出しのサブルーティンに変える働きもあります。

     サブルーティンは再帰的に呼び出すこともできます。 サブルーテ
     ィンを "&" 形式で呼び出す場合、引数リストは省略できます。
     省略した場合には、そのサブルーティンに対しては、@_ 配列が設
     定されません。 呼び出し時点での配列 @_ が、そのままサブルー
     ティン側でも見えることになります。

         &foo(1,2,3);        # 3 つの引数を渡す
         foo(1,2,3);         # 同じ

         foo();              # 空リストを渡す
         &foo();             # 同じ
         &foo;               # 何も渡さない (より効率的)







Perl manpages Last change: Release 5.0 Patchlevel 00            2






PERLSUB(1)               USER COMMANDS                 PERLSUB(1)



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

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

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

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

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

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

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


     組み込み関数の再定義

     多くの組み込み関数は、再定義することができますが、これは、ち
     ゃんとした理由があるときに限って行なうべきです。 UNIX 以外
     のシステムで、実装されていない組み込み関数をエミュレートする
     ために使われるのが普通でしょう。

     再定義は、モジュールから名前をインポートすることでのみ行なう



Perl manpages Last change: Release 5.0 Patchlevel 00            3






PERLSUB(1)               USER COMMANDS                 PERLSUB(1)



     ことができ、通常の前方宣言は十分ではありません。 しかし、
     subs プラグマ (コンパイラディレクティブ) を使うと、インポー
     ト構文で前方宣言されたものと同様に有効となり、組み込み関数を
     その名前で再定義することができます:

         use subs 'chdir', 'chroot', 'chmod', 'chown';
         chdir $somewhere;
         sub chdir { ... }

     ライブラリモジュールは一般に、デフォルトの @EXPORT リストの
     一部として "open" や "chdir" といった組み込みの名前をエクス
     ポートすべきではありません。 これらの名前は、思わぬところの
     名前空間に侵入して、思わぬように意味を変えてしまうかも知れな
     いからです。 その代わりに、モジュール側で @EXPORT_OK に名前
     を入れておけば、使用する側では暗黙にではなく、明示的にインポ
     ートすることができるようになります。 つまり、

         use Module 'open';

     とは書くことができ、open をインポートして再定義しますが、

         use Module;

     とした場合には、再定義の無いデフォルトのインポートが行なわれ
     ます。


     自動ロード

     もし、未定義のサブルーティンを呼び出した場合には、通常はすぐ
     に、「サブルーティンがない」というコンパイル時の致命的エラー
     になります。 (メソッドとして使われるサブルーティンも同様で、
     そのクラスのどの基底クラスにもメソッドが存在しない場合に、エ
     ラーとなります。) しかし、AUTOLOAD というサブルーティンが、
     そのパッケージか、もとのサブルーティンが探されるサブルーティ
     ンで定義されていれば、その AUTOLOAD サブルーティンが、もとの
     サブルーティンを呼び出すときに渡すはずだった引数を使って、呼
     び出されます。 もとのサブルーティンの完全な名前は、AUTOLOAD
     ルーティンとして、同じパッケージの変数 $AUTOLOAD に記録され
     ています。 名前は、普通の引数としては渡されません。 という
     のは、あー、その、だから ...

     多くの AUTOLOAD ルーティンは、eval を用いて、問題のサブルー
     ティンの定義をロードし、そのサブルーティンを、トレースなしに
     AUTOLOAD ルーティンのスタックフレームを消してくれる、特殊な
     形式の "goto" を使って呼び出します。 (たとえば、標準の
     AutoLoader モジュールを参照してください。) しかし、改めて定
     義を行なわずに、AUTOLOAD ルーティン自身で、実行されるはずの
     ルーティンをエミュレートすることも可能です。 この形式の良い
     例としては、未定義のサブルーティン呼び出しを UNIX プログラム
     への呼び出しとして扱う、標準の Shell モジュールがあげられま
     す。



Perl manpages Last change: Release 5.0 Patchlevel 00            4






PERLSUB(1)               USER COMMANDS                 PERLSUB(1)




     モジュールが自分自身を、標準の AutoLoader モジュールといっし
     ょに使用するために、自動ロード可能なファイルに分割するのを補
     助するしくみが用意されています。 拡張モジュールに関するドキ
     ュメントを参照してください。


















































Perl manpages Last change: Release 5.0 Patchlevel 00            5