繰り返し

繰り返し

繰り返しについて

同じ処理を何度も繰り返すプログラムを書く場合、同じプログラムを何度も書けば実現することができます。例えば 繰り返しのテスト1。繰り返しのテスト10。 という文字を画面に表示させたい場合、一例ですが以下のようなプログラムを作成します。

#!/usr/local/bin/perl

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";

print "<p>繰り返しのテスト1。</p>\n";
print "<p>繰り返しのテスト2。</p>\n";
print "<p>繰り返しのテスト3。</p>\n";
print "<p>繰り返しのテスト4。</p>\n";
print "<p>繰り返しのテスト5。</p>\n";
print "<p>繰り返しのテスト6。</p>\n";
print "<p>繰り返しのテスト7。</p>\n";
print "<p>繰り返しのテスト8。</p>\n";
print "<p>繰り返しのテスト9。</p>\n";
print "<p>繰り返しのテスト10。</p>\n";

print "</body>\n";
print "</html>\n";

exit;

これはこれで問題なく動作します。ですが繰り返す回数が100回になった場合や繰り返し実行するプログラムの量が多い場合、この方法では少し面倒です。修正時に入力ミスをしてしまう可能性も高いです。

このような場合、繰り返し用の命令を使用することにより、記述するべきプログラムの量を少なくすることができます。

while 制御文

繰り返し処理を行う方法はいくつか用意されていますが、そのうちの1つに『while制御文』があります。具体的には、以下のようなプログラムで繰り返し処理を行います。

while (繰り返す条件) {
  条件に一致した場合に繰り返し実行するプログラム
}

if の時と書き方が似ていますが、while の場合は少し処理の流れが変わります。if の場合は『条件に一致した場合に繰り返し実行するプログラム』が一度実行されただけでしたが、while の場合は実行後に再度『繰り返す条件』を判定し、条件に合う間は『条件に一致した場合に繰り返し実行するプログラム』を実行し続けます。

先ほど挙げたプログラムを『while制御文』を使用して記述すると、以下のようになります。

#!/usr/local/bin/perl

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";

$count = 1;
while ($count <= 10) {
  print "<p>繰り返しのテスト$count。</p>\n";
  $count++;
}

print "</body>\n";
print "</html>\n";

exit;

このプログラムの場合、繰り返す条件は $count <= 10 です。つまり、$count10 以下ならば処理が繰り返し実行されます。

繰り返す処理の内容は print "<p>繰り返しのテスト$count。</p>\n";$count++; です。つまり、画面に 繰り返しのテスト(変数countの内容)。 と表示してから $count1 を加えます。

こうすれば $count10 以下の間、画面に文字列を表示してから $count の値が 1 ずつ増えていきます。そして $count の値が 10 より大きく時点で繰り返し処理は終了します。

つまり、画面に 繰り返しのテスト1。繰り返しのテスト10。 が表示されるのです。

for 制御文

繰り返し処理を行うもう一つの方法に『for制御文』があります。while と同様に繰り返し処理を行うことができますが、プログラムの書き方が違います。具体的には、以下のようなプログラムで繰り返し処理を行います。

for (繰り返し準備処理 ; 繰り返し条件式 ; 繰り返し後処理) {
  条件に一致した場合に繰り返し実行するプログラム
}

先ほど while で記述したプログラムを for を使用したものに書き換えると、以下のようになります。

#!/usr/local/bin/perl

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";

for ($count = 1; $count <= 10; $count++) {
  print "<p>繰り返しのテスト$count。</p>\n";
}

print "</body>\n";
print "</html>\n";

exit;

「繰り返し準備処理」は繰り返し処理に入る前に一度だけ実行されます。それ以降は

  1. 「繰り返し条件式」が成立すれば
  2. 「条件に一致した場合に繰り返し実行するプログラム」を実行してから
  3. 「繰り返し後処理」を実行する
  4. 再度「繰り返し条件式」のチェックに戻り、以下条件が成立する間はずっと繰り返す。

となります。

foreach 制御文

繰り返し処理は『foreach制御文』で行う事もできます。これは以下のようなプログラムで繰り返し処理を行います。

foreach 繰り返し対象の値が代入される変数 (繰り返し対象) {
  繰り返し実行するプログラム
}

先ほど while で記述したプログラムを foreach を使用したものに書き換えると、以下のようになります。

#!/usr/local/bin/perl

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";

foreach $value (1 .. 10) {
  print "<p>繰り返しのテスト$value。</p>\n";
}

print "</body>\n";
print "</html>\n";

exit;

このプログラムの場合、繰り返し対象は 1 .. 10 です。このように指定すると、繰り返しを10回実行する事ができ、$value には1~10の値が順に代入されていきます。繰り返す処理の内容は print "<p>繰り返しのテスト$value。</p>\n"; です。つまり、画面に「繰り返しのテスト(数値)。」と10回表示されます。((数値)の部分には、1~10の値が順に表示されます。)

…というわけで3つの繰り返し処理を紹介しましたが、whileforforeach のどれを使っても繰り返し処理を行う事ができます。解りやすいと思った繰り返し制御文を使用すればいいでしょう。

ループ制御文について

whileforforeach による繰り返し処理は、繰り返す条件が成立する間は処理が実行し続けられます。ですが、ループ制御文を使用すれば、特定の条件に応じてループから抜けるなどの動作ができるようになります。

ループ制御文には、以下のものがあります。

制御文 意味
continue 今回の繰り返し処理をやりなおす
next 今回の繰り返し処理をスキップし、次の回の繰り返し処理を行う
last 繰り返し処理から直ちに抜ける

先ほど挙げた『while制御文』を使用したサンプルにループ制御の処理を加えると、以下のようになります。

#!/usr/local/bin/perl

print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html>\n";
print "<head><title>サンプル</title></head>\n";
print "<body>\n";

$count = 1;
while ($count <= 10) {
  if ($count > 5) {
    last;
  }
  print "<p>繰り返しのテスト$count。</p>\n";
  $count++;
}

print "</body>\n";
print "</html>\n";

exit;

これを実行すると、ブラウザに 繰り返しのテスト1。繰り返しのテスト5。 までが表示されます。本来は10まで表示されるのですが、$count5 になった時点で繰り返し処理から抜けるようにしています。