MTでPerlを学ぶ(その12・while文による繰り返し)

前回から1か月以上間が空いてしまいましたが、「MTでPerlを学ぶ」の第12回をお送りします。
今回は、while文による繰り返しを解説します。

1.条件に応じて繰り返すかどうかを判断する

前回は、for文による繰り返しを解説しました。
for文は、主に一定回数の繰り返しを行うときに使います。

ただ、繰り返しの中で、繰り返しを続けるかどうかを条件判断したい場合もあります。
例えば、一般的なプログラミングの中では、「データが見つかる間、データを読み込んで処理をする」という繰り返しを行うことがよくあります。
処理の流れを図で表すと、以下のようになります。


図を大きく表示

上の図のような例で、データを読み込んでいかないとデータの件数が確定しないとします。
となると、繰り返す回数をあらかじめ決めることができませんので、for文を使うのはあまり適切ではありません。

2.while文で繰り返しを行う

前述の図のように、繰り返しの先頭で繰り返しを続けるかどうかを条件判断し、条件を満たしている間繰り返しを続けるには、「while」という文を使います。
while文の書き方は、以下のようになります。

while (条件) {
    繰り返す処理
}

例えば、上で例にあげた図をwhile文で書くと、以下のようになります。

while (データがある) {
    データを読み込む
    データを処理する
}

3.例

while文を使った例として、「MTで管理しているブログの名前をすべて出力する」というプログラムを作ってみます。
実際のプログラムは以下のようになります。

use MT::Blog;

print '<ul>';
my $iter = MT::Blog->load_iter;
while (my $blog = $iter->()) {
    print '<li>' . $blog->name . '</li>';
}
print '</ul>';

上記を含むインデックステンプレートのサンプルをダウンロード

プログラムの内容は以下の通りです。

1行目

ブログ(MT::Blog)を操作するための「おまじない」と思っておいてください。
詳細は拙著「Movable Type Developer's Guide Volume 1」で解説しています。

3行目

リストの先頭のulタグを出力します。

4行目

ブログを順に読み込むために、変数$iterに「イテレータ」というものを作成しています。
イテレータの詳細も、拙著「Movable Type Developer's Guide Volume 1」で解説しています。

5行目

ブログを1つ読み込み、変数$blogに代入します。
ブログの読み込みに成功すると、whileの中の値は真とみなせる(=条件が成立したとみなせる)値になります。
一方、ブログをすべて読み込み終わると、変数$blogの値は偽になります(=条件が成立していないとみなせる)。
そのため、ブログを読み込み終わるまでは、while文によって繰り返しが行われます。

6行目

ブログの名前を出力します。

8行目

リストの最後の「</ul>」のタグを出力します。