ポイント3: サブルーチンの引数をチェック
さて最後のチェックポイントはサブルーチンの引数チェックです。これについては、「Perl の関数『サブルーチン』を使う」でも1回触れましたが、考え方は先ほどの入力チェックと同じです。予期しない値が入力されてしまった時に、ズルズルと無駄な処理を続けたり、変なエラーが出たりしないように入り口でセキュリティチェックをする訳です。
プログラムの入力チェックと両方やる必要があるのですか?
さてでも、今回の場合は、さっきプログラムの入力チェックを付けたので、もう数値以外がサブルーチン laugh に代入される事はありませんよね。こんな場合でも引数チェックをしなければならないのでしょうか?答えはYesです。
なぜなら、ある日誰かが(未来の自分も含めて)このプログラムを流用したり、書き換えたりして使うかもしれません。その人はもしかしたらものすごく急いでプログラミングをしていたり、または超初心者プログラマーかもしれません。そんな時には入力チェックがしっかりされる保証がありません。このため、ダブルチェックの意味で付けておきます。
また、いずれは自分が書いたサブルーチンを「モジュール」として人に提供する事もあるかもしれませんね。そんな時のためにも、サブルーチンは引数チェックをする習慣を付けてしまって下さい。
【ポイント3】サブルーチンの引数をチェック
今回の場合は、プログラムの入力チェックと同じように数値である事をチェックした上、もし条件を満たしていなかったら初期設定値として25を代入する事にします。
このチェックがうまく効いているかを確認するために、入力側のチェックは一時的にコメントアウトしてプログラムを実行してみましょう。
サンプルプログラム: サブルーチンの引数チェックを追加
#冒頭省略 my ($length, $outfile); #設定を入力させる print '笑う長さを指定して下さい(数字): '; my $length_input = <STDIN>; chomp $length_input; #(サブルーチンテストのための一時的設定)無条件に代入 $length = $length_input; #if ($length_input =~ m/^\d+$/ and 0 < $length_input){ # $length = $length_input; #} else { # die "長さの指定が違います。\n"; #} #中略 #指定した長さに応じて笑いを返す #引数:長さ (数値: 1以上。形式エラーは デフォルト 25をセット。) #戻り値:笑い (文字列) sub laugh{ my $length = shift; unless ( $length =~ m/^\d+$/ #数字 and 0 < $length #0より大きい ){ $length = 25; } my $default = 10; #一息長さの初期値 #中略 return "$output\n"; }変更後のプログラムを実行してみましょう。
% perl -T prog.pl 笑う長さを指定して下さい(数字): -30 保存するファイル名を指定して下さい(半角英数字): laughter.txt わーっはっはははははははははは。わーっはっはははははははははは。わーっはっははははは。「-30」と指定しましたが、エラーにならず、初期設定とした 25 分の長さで表示されています。
>次は: プログラムの入力とサブルーチンの引数のダブルチェックをする理由