for 文

プログラムは文の集合から成っている。 代入文にしろ print 文にしろ、それらは左から右へ、上から下へ順番に実行されていく。 そして最後の文が実行されると、プログラムは終了となる。 このように順番に実行されていく様子を「プログラムの流れ」と呼ぶが、これをコントロールする方法がいくつか用意されている。

例として、九九表を作る問題を考えてみよう(あんまりおもしろくないが)。 最初は7の段の九九を表示するプログラムを作ってみる。 次のような出力が得られれば成功だ。

7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63

print 文を使えば、こんなプログラムでも結果は得られる。

print "7 * 1 = 7\n";
print "7 * 2 = 14\n";
print "7 * 3 = 21\n";
print "7 * 4 = 28\n";
print "7 * 5 = 35\n";
print "7 * 6 = 42\n";
print "7 * 7 = 49\n";
print "7 * 8 = 56\n";
print "7 * 9 = 63\n";

しかしこれでは面倒だ。 そこで、プログラムで楽をしよう。

for ($i = 1; $i <= 9; $i++) {
	$ans = 7 * $i;
	print "7 * $i = $ans\n";
}

for 文は、ループ(繰り返し)を作るのに便利な機能だ。 一般的な形式はこうだ。

for (初期化 ; 条件式 ; 再初期化 ) {
	ループ;
}

for の直後のカッコの中身は、セミコロンで区切られた3つのパートからなる。 最初のパート「$i = 1」は、最初に1度だけ実行される初期化パートだ。 ここでは変数 $i に 1 を代入している。 次の「$i <= 9」はテストを行う条件式パートで、条件式を評価して、真ならばループを実行し、偽ならばループを終了する。 最後の「$i++」はループの最後に実行される再初期化パートだ。

プログラムの流れを順に説明しよう。

  1. 「for ($i = 1;」の部分が解釈され、変数 $i に 1 がセットされる。
  2. 「$i <= 9」が評価される。 これは「変数 $i が 9 以下か否か」を判定している。 式が正しい(9以下)ならば、結果は真となる。 今変数 $i は 1 だから、これは真である。 したがってループが実行される。
  3. ループは「{ … }」の部分だ。 そこにはすでに紹介した計算と print 文がある。 「$ans = 7 * $i;」では、変数 $i と 7 の積が計算され、$ans に代入される。
  4. print 文では、結果を表示している。
  5. これでループは終了だ。 ここで for の3つめのパートが実行される。 つまり「$i++」が実行されるわけだ。 これは「変数 $i に 1 を足す」という意味だ。 これまで 1 だった変数 $i が、2 になるというわけである。
  6. ここで、処理は 2. に戻り、「9以下」かどうかが判定される。 以下、ループが何度も繰り返される。 変数 $i はその都度 1 ずつ増えていく。
  7. 最後には、変数 $i は 10になる。 ここで初めて、テストの「$i <= 9」が偽となる。 for 文はここで終了する。

以上で、たった4行のプログラムが9行の出力を生み出すわけである。

Perl では、for に似た foreach 文も用意されている。 条件や後処理などをいちいち明示しなければならない for 文と違って、 九九表のように「ある値から別の値へ1ずつ変化する場合」などは、foreach の方が簡単に書ける。

foreach $i (1 .. 9) {
	$ans = 7 * $i;
	print "7 * $i = $ans\n";
}

カッコの中の「1 .. 9」というのが、「1から9まで1ずつ順に」という意味だ。 その数値が $i に代入され、ループが実行される。 結果は for 文のときとまったく同じだ。

これを用いて、九九表を完成させてみよう。 いちいち式を表示すると、欄が足りなくなってしまいそうなので、簡単に答えだけ表示することにしよう。

foreach $i (1 .. 9) {
        foreach $j (1 .. 9) {
                $ans = $i * $j;
                print "\t$ans";
        }
        print "\n";
}

結果は次のようになる。

% perl kuku.pl
     1    2    3    4    5    6    7    8    9
     2    4    6    8    10   12   14   16   18
     3    6    9    12   15   18   21   24   27
     4    8    12   16   20   24   28   32   36
     5    10   15   20   25   30   35   40   45
     6    12   18   24   30   36   42   48   54
     7    14   21   28   35   42   49   56   63
     8    16   24   32   40   48   56   64   72
     9    18   27   36   45   54   63   72   81

81 項目の表が、瞬間的に表示されるはずだ。


[go to next chapter]
[back to index]