さて第1章も最終節となりました。 今まで簡単な認証プログラムを作ってきましたが,締めくくりとして「スクリプト内アウトソーシング」についてお話しましょう。 今まで作ってきたスクリプトは40行チョットなのでそんなに感じないかもしれませんが,これが数百行,数千行となると,「あれ,アノ処理はどこでやってたっけかなあ」なんてことが出てきます。 不具合の修正などをする時にも,いちいち最初からスクリプトを読んでいたのでは,それだけで日が暮れちゃいますね。 そうでなくても,1つの処理に数十行なんてことになると,全体的なスクリプトの流れがつかみにくくなってきます。 そこで登場するのがサブルーチンです。
今まで「関数」をたくさん使ってきました。 これらはあらかじめPerlが用意してくれていたものばかりで、このような関数を「組込み関数」といったりします。 これに対し,これから作るサブルーチンは,「カスタム関数」と呼ばれることもあり,その名前の示すとおり,自分で作る関数のことです。
ここでは練習として,スクリプトの最初の部分,ファイルからデータを読み込んでハッシュを作成するところまでをサブルーチンにします。
01: &yomikomi;
02: print "あなたのお名前なんてーの?:";
03: $yourname = <STDIN>;
04: chomp($yourname);
05: $namecheck = 0;
06: foreach $username (keys %passwd) {
07: if($yourname eq $username){
08: $namecheck = 1;
09: print "よっ、$yournameちゃん、どう?最近。\n";
10: $pwdcheck = 0;
11: for($j = 0; $j < 3; $j = $j + 1){
12: print "パスワード入力:";
13: $yourpasswd = <STDIN>;
14: chomp($yourpasswd);
15: if($yourpasswd eq $passwd{$username}){
16: print "OK. 入ってイイよ〜\n";
17: $pwdcheck = 1;
18: last; #forループから脱出(A)
19: } else{ #条件式が偽の場合ここを実行
20: print "おや、パスワード間違えた?\n";
21: }
22: }
23: #(A)ここへ出てくる
24: } else{
25: next; #次のループへ(B)
26: }
27: if(($namecheck == 1) && ($pwdcheck == 1)){
28: last; #名前もパスワードも一致したら(C)
29: } elsif($pwdcheck == 0){
30: print "ムム、お主何やつ!\n";
31: }
32: #(B)ここへ移動して次のループへ
33: }
34: #(C)ここへ移動
35: if($namecheck == 0){
36: print "あれ? 名前が登録されてないよ。\n";
37: }
38:
39: sub yomikomi{
40: open(IN, "<user.dat"); #ファイルオープン
41: @data = <IN>; #データを読み込んで
42: close(IN); #ファイルクローズ
43: foreach(@data){
44: ($name, $passwd) = split(/,/, $_);
45: chomp($passwd);
46: $passwd{$name} = $passwd;
47: }
48: }
まず1行目。 yomikomiという名前のサブルーチンを呼び出しています。 サブルーチンを呼ぶときは,先頭に&をつけます。 サブルーチンが呼ばれると,処理は一度そちらへ移ります。 今の場合,1行目で&yomikomiが呼ばれると39行目に処理が飛んで,48行目まで処理をしてから2行目にもどります。
では,サブルーチンを作るときはどうすればいいのでしょう? これも簡単です。 39行目のように,subと書いて,空白文字を入れた後でサブルーチン名を書き,実際の処理を{ }で囲んで記述します。
Perlには,自分で作るサブルーチンのほかに、よく使われる処理を,多くのプログラマーがボランティアですでに作っています。 これらをライブラリといいます。 これらのライブラリをうまく使っていくこともPerl職人への1つの道です。
第1章はこれでおしまいです。 簡単な認証プログラムを作りながら,Perlとはどんな言語なのか,Perlで何が出来るのかという事をチョコチョコかいつまんでみてきました。 第2章以降では,それぞれのテーマについて,もう少し詳しく見ていくことにしましょう。