初めてのPerl その3(4章)
前回の続き。
例によって、まとめ内の注釈は間違っている可能性あり。
4章 サブルーチン
- サブルーチン名は、「
&
+Perl識別子」で表す。 - サブルーチンの定義
sub f { # do something... }
- 呼び出すには、サブルーチン名を書けばいい。
&f;
戻り値
- 最後に評価される式が戻り値になる。
# $aと$bの大きい方が戻り値 sub max { if ($a > $b) { $a; } else { $b; } }
レキシカル変数
sub max { my($a, $b); # サブルーチン用のプライベートな変数 ($a, $b) = @_; # パラメータに名前を付ける if ($a > $b) { $a; } else { $b; } }
より良い書き方
sub max { # プライベート変数に引数をセット my($a, $b) = @_; # コードが単純でブロックが1行に収まる場合に限って # 最後のセミコロンを省くのが普通 if ($a > $b) { $a } else {$b } }
可変長引数
- 引数のチェック
@_
のサイズを調べることで可能。- 実世界の
Perl
プログラミングではあまり使うことはない。 - サブルーチンをパラメータに適応させる方が好ましい。
- 改良版の
&max
$maximum = &max(3, 5, 10, 4, 6); sub max { my($max_so_far) = shift @_; foreach (@_) { if ($_ > $max_so_far) { $max_so_far = $_; } } $max_so_far; }
レキシカル変数についての注意事項
- スコープはブロックレベル。
my
演算子は、代入のコンテキストを変えない。
# リストコンテキスト、($num) = @_; と同じ # 最初のパラメータが代入される my($num) = @_; # スカラーコンテキスト、 $num = @_; と同じ # パラメータの個数が代入される my $num = @_;
return
演算子
- 戻り値を返し処理を終了する。
return;
とした場合、空の値を返す。- スカラーコンテキストでは
undef
- リストコンテキストでは、空リストを返す。
- スカラーコンテキストでは
- 空の値を返すことを明示的に示したい場合、
return ();
とする。
アンパサンドを省略してサブルーチンを呼び出す場合
- 同名の組込関数が優先して呼び出される。
- サブルーチンの起動よりも後ろで、サブルーチンを宣言してはいけない。
本日は
ここまで。
*1:JavaScriptのargumentsオブジェクト的な。
*2:このへんもJavaScriptと同じ。
*3:my使わないとグローバル変数になるのは、JavaScriptっぽい。ただし、Perlのスコープは関数レベルだけど
*4:本書に、初めて読む時は飛ばしてください、と書いてあるので。