ループ内制御
強制的に離脱する
whileやuntil、forステートメントなどでループを作れることはわかりました
しかし、何らかの条件によって強制的にループから離脱したい場合なども考えられます
ループ制御ステートメントに共通して使うことができるループ制御文も存在します
このような場合は、ループ制御文を用いてプログラマの意図によって流れを変えることができます
強制的にループから抜け出すにはlastステートメントを用います
lastが実行されると、現在のループを抜け出して次の命令から実行します
while (1) {
print "exitを入力すれば終了します\n";
$getkey = <STDIN>;
chomp($getkey);
if ($getkey eq "exit") {
last;
}
}
print "ループを抜けました";
if ($getkey eq "exit") {が成立すると last ステートメントが実行されます
while(1)という条件式がありますね。これは常に「真」を表します。すなわち無限ループを意味します
Perl言語は文字式を判定する場合は数学演算子を用いませんので他言語のプログラマは注意してください
eqは文字列として等しければという意味です。くわしくは演算子一覧表をごらん下さい
nextとredo
ループの中で強制的にループの最初まで戻るということも可能です
長いループを制御するプログラムになると、このようなケースによく当たります
ループの先頭に復帰するステートメントは似たものが二つあります
nextとredoがそれです
勘違いしやすいですが、この二つは大きく違います
まず、nextはループ制御ステートメントまで戻ります。つまり条件式の判定をします
次にredoですが、これは繰り返す実行ステートメントの先頭まで戻ります。条件式の判定はしません
for ($re = 0 ; $re < 10 ; $re++) {
print '現在の変数 $re の値は' . "$reです\n";
print "nextかredoか入力してください\n";
$getkey = <STDIN>;
chomp($getkey);
if ($getkey eq "next") {
print "nextを実行してforステートメントまで戻ります\n\n";
next;
}
elsif ($getkey eq "redo") {
print "redoを実行して繰り返しステートメントの先頭に戻ります\n\n";
redo;
}
else {
print "該当しないので、正常にループします\n";
}
}
print "プログラムを終了します";
nextを実行すると$reに1加算されます。ということはforの条件判断まで戻っているということです
しかし、redoは加算されません。redoを実行するとprint '現在の変数 $re の値は' . "$reです\n";まで戻ります
そのため$reは変化しないのです
それぞれループの中で上手に使うことによって、より複雑な処理ができるようになります
とくにnextとredoの違いはしっかりと理解しましょう