<Perlにおけるサブルーチン>

>>定義と使用

プロトタイプ無しの実体。
$test = &testroutine;

sub testroutine {
    実行文
    値を返す式
}

サブルーチンtestroutineを定義し、使用するコード。
subの後に名前を続け、{}で括って実行文を記述する。
1行目は定義したtestroutineを呼び出すコード。
サブルーチン名の頭に"&"をつける。つけなくても良いが、つけた方が無難。

サブルーチンに渡す引数は、Cのように必ず明示的に指定する必要はない。 この例のように指定しなかった場合、特殊配列@_の中身が引数としてサブルーチンに渡される。 ここを正確に言うと、サブルーチン呼出元の@_に、 サブルーチン内部からアクセスできるようになる。 従ってこの場合、サブルーチン側で@_の中身を変更すると、それがサブルーチン呼出元に反映されてしまう(同じものであるから)。
渡す引数を明示的に指定する場合は、Cのように

$test = &testroutine($testparam);
とする。
この場合もサブルーチン側では@_で引数にアクセスする。 サブルーチン側の@_はただ1つの要素を持ち、これは呼出元の$testparamと同じものを指し示している。 よって、サブルーチン側で$_[0]を変更すると、呼出元の$testparamもやはり変わってしまう。
以上のような面倒を回避するには、サブルーチン内の頭で
my @args = @_;
としておくべきである。
myをつけると、その次にくる変数は今いるブロック内でしか有効でなくなるので、 いくら@argsを弄ろうと、その影響がブロック外(すなわちサブルーチン呼出元)に波及することはない。

これまでの話はスカラー変数を渡す場合の話。
配列やハッシュ変数を渡す場合は、リファレンス化したものを渡すのが良い。型グロブでもいいけど俺は使ったことが無いのでパス。

次は戻り値の話。
Cのようにreturnをつける必要はない。その場合、サブルーチン内で最後に評価された式の値になる。 意外なものが値を返したりするので、ちゃんとreturnをつけるのがやっぱり無難。その時は次のようにする:

return(評価式);
変数を渡すときと同様、変数を返すときも、配列やハッシュの場合はリファレンスにすべき。 さもないと、バラバラに展開されたスカラーのリストになってしまう。

accend->Perl->labnote->index page