まくまくPerlノート
サブルーチンの基本
2008-01-29

サブルーチンの引数

サブルーチンへ渡された引数は @_ という配列変数で参照できます。 個々の値を取り出すには、$_[0], $_[1] のようにアクセスします。 @_ はサブルーチンにローカルな変数であり、この内容を変更しても、呼び出し元には反映されません。

sub print_params {
    print "$_[0]\n";
    print "$_[1]\n";
}

引数の意味を明確にするために、次のようにサブルーチンの先頭でリスト代入すると分かりやすくなります。

sub do_something {
    my ($foo, $bar) = @_;    # 引数がひとつの場合は my ($foo) = @_;
    ...
}

サブルーチンの戻り値

サブルーチンで最後に評価された式の結果が、サブルーチンの戻り値になります。 C 言語と同様に明示的に return することもできます。

sub add {
    my ($lhs, $rhs) = @_;
    $lhs + $rhs;    # この式を評価した結果が戻り値になる
}

戻り値をリストにすれば、擬似的に複数の値を返すサブルーチンとして使用できます。

sub foo() {
    my $a = 1;
    my $b = 2;
    my $c = 3;
    return ($a, $b, $c);
}

($aa, $bb, $cc) = &foo();  # $aa = 1, $bb = 2, $cc = 3 になる

サブルーチンの呼び出し

サブルーチンはサブルーチン名の前にアンパサンド (&) を付けて呼び出します。

my $result = &add(100, 200);

サブルーチンの前に & を付けずに、組み込み関数のように呼び出すこともできます。

my $result = add(100, 200);   # 組み込み関数風の呼び出し(方法1)
my $result = add 100, 200;    # 組み込み関数風の呼び出し(方法2)

ただし、& を呼び出さずに呼び出せるのは、下記の条件を満たす場合のみです。

  • 呼び出しより前に、サブルーチンが定義されている。
  • 同じ名前の組み込み関数が存在しない。

これらの条件を満たさない場合に & を付けずにサブルーチンを呼び出すと、同じ名前の組み込み関数があった場合に、無条件で組み込み関数の方が呼び出されてしまいます。 組み込み関数ではなく、ユーザが定義したサブルーチンであること明確にするため、サブルーチンは & を付けて呼び出すことが推奨されています。

2008-01-29