サブルーチンへ渡された引数は @_
という配列変数で参照できます。
個々の値を取り出すには、$_[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)
ただし、&
を呼び出さずに呼び出せるのは、下記の条件を満たす場合のみです。
これらの条件を満たさない場合に &
を付けずにサブルーチンを呼び出すと、同じ名前の組み込み関数があった場合に、無条件で組み込み関数の方が呼び出されてしまいます。
組み込み関数ではなく、ユーザが定義したサブルーチンであること明確にするため、サブルーチンは &
を付けて呼び出すことが推奨されています。