§1.4 Give me a chance


作成日:2001/05/28(月)

さて、前節のパスワード判定スクリプトですが、パスワードを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. 入ってイイよ〜

どうですか? だんだんプログラムっぽくなってきましたね。


「§1.3 秘密の合言葉」へ 「§1.5 嬉しい悩み」へ
ソフトバンク パブリッシング株式会社

Copyright (C) can All Rights Reserved
e-mail:ishiki@mrj.biglobe.ne.jp