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


サブルーティン

Synopsis

サブルーティンの宣言:
sub NAME;      # 「前方」宣言
sub NAME BLOCK # 宣言かつ定義
サブルーティンのインポート:
use PACKAGE qw(NAME1 NAME2 NAME3);
サブルーティンの呼び出し:
&NAME          # その時点の @_ をサブルーティンに渡す。
&NAME(LIST);   # & 形式では、引数に括弧が必要。
NAME(LIST);    # 括弧があるときには & はなくてもよい。
NAME LIST;     # 宣言済み/インポート済みのとき括弧はなく
               # てもよい。

Description

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

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

例:

sub MAX {
    my $max = pop(@_);
    foreach $foo (@_) {
        $max = $foo if $max < $foo;
    }
    $max;
}
...
$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;               # 何も渡さない (より効率的)


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

検索式: