さて、前節のパスワード判定スクリプトですが、パスワードを1度間違えたら即アウト、というのではタイピングの苦手な人や初心者には酷ですね。 そこでちょっと改良して、3回までは間違えてもいいことにしましょう。 そこで登場するのがforループです。 forループは次のような形をしています。
for(初期化式; 条件式; 増減式){
実行文;
}
まず初期化式で、forループを制御するための変数に初期値を与えます。 次に条件式を見て、これが真ならば以下の実行文を実行します。 そして増減式によって、制御変数の値を変更します。 するとまた条件式がチェックされ、これが真ならば実行文が実行されます。 この一連の動作を、条件式が偽になるまで繰り返します。
と説明だけしてもなんだかわからないので、とりあえずスクリプトを見てみましょう。
01: $username = 'can'; #文字列を代入する時は''か""で囲む
02: $passwd = 'nyanko';
03: print "あなたのお名前なんてーの?:";
04: $yourname = <STDIN>;
05: chomp($yourname);
06: if($yourname eq $username){ #()内が真なら以下を実行
07: #↑文字列の比較には
08: #eq演算子を使う
09: print "よっ、$yournameちゃん、どう?最近。\n";
10: $check = 0;
11: for($i = 0; $i < 3; $i = $i + 1){
12: print "パスワード入力:";
13: $yourpasswd = <STDIN>;
14: chomp($yourpasswd);
15: if($yourpasswd eq $passwd){
16: print "OK. 入ってイイよ〜\n";
17: $check = 1;
18: last; #forループから脱出
19: } else{ #条件式が偽の場合ここを実行
20: print "おや、パスワード間違えた?\n";
21: }
22: }
23: if($check == 0){
24: print "ムム、お主何やつ!\n";
25: }
26: } else{
27: print "あれ? 名前が登録されてないよ。\n";
28: }
上の改良版を見ながらforループの動きを見ていきましょう。
10行目。 新しい変数$checkに値0をセットします。 $checkはパスワードが一致すると1に変化します。
11行目からがforループです。 まず初期化式、
$i = 0;
でループの制御用の変数$iに初期値0をセットします。 次に条件式、
$i < 3;
をチェックします。 <は数学の「小なり」と同じです。 今の場合$iの値は0なので真です。 そこで12行目から21行目までを実行します。
最後に、
$i = $i + 1;
というヘンな式があります。 数学の等式としては間違いですが、PerlではこれでOKです。 §1.2 あなたのお名前なんてーの?でも説明したとおり、この=は代入演算子です。 今の場合「$iの今の値に1を加えてまた$iに代入する」という意味になります。 つまり$iの値を1増やすということです。 これによって$iの値が1になります。 するとまた条件式がチェックされ実行文が繰り返されます。 そして$iの値が3になると、条件式が偽になるのでforループは終了します。
実行文の中身を見ていくと15行目でif文を使ってパスワードの判定をしています。 パスワードが一致したら16行目で「OK. 入ってイイよ〜」と表示して、17行目で$checkの値を1に変更します。 そして18行目、
last;
とありますね。 このlast関数はそこでループを強制的に終了させ、23行目に飛ばします。
23行目。 if文です。 $checkの値が0ならば真となります。今の場合、パスワードが一致すると17行目で$checkの値は1になるので、$checkが0ということは3回ともパスワードが一致しなかったという事を意味します。 なので「ムム、お主何やつ!」と表示します。 このように、数学の「=」はPerlでは「==」と表します。
スクリプトを実行すると…
あなたのお名前なんてーの?:can
よっ、canちゃん、どう?最近。
パスワード入力:nyunko
おや、パスワード間違えた?
パスワード入力:nyonko
おや、パスワード間違えた?
パスワード入力:nyanko
OK. 入ってイイよ〜
どうですか? だんだんプログラムっぽくなってきましたね。