MTでPerlを学ぶ(その14・次の繰り返しに進む)

「MTでPerlを学ぶ」の第14回をお送りします。
今回は、for文やwhile文の中で、以後の処理をスキップして次の繰り返しに進む方法を解説します。

1.繰り返しをスキップする例

繰り返しによっては、その途中で条件判断して、条件が成立したら繰り返しの残りの部分をスキップして、次の繰り返しに進みたい場合があります。

例えば、「最近のブログ記事100件の中で、タイトルに『Movable Type』を含む記事だけを抜き出し、そのタイトルを出力する」という処理を考えてみます。
この処理は、以下のような流れで行うことができます。
記事のタイトルに「Movable Type」を含むかどうかを判断し、「Movable Type」を含まなければ、繰り返しの残り(タイトルの出力)の処理をスキップして、次の記事を調べる処理に進むようにすれば良いです。


図を大きく表示

2.next文で次の繰り返しに進む

繰り返しの残りの処理をスキップして、次の繰り返しに進むには、「next」という文を使います。
forやwhileの繰り返しがあって、その途中で次の繰り返しに進むことがある場合、その一般的な処理の流れを図にすると、以下のようになります。


図を大きく表示

この図をプログラムにすると、以下のようになります。

forまたはwhile {
    繰り返し前半の処理
    if (条件) {
        次の繰り返しに進む前の処理
        next;
    }
    繰り返し後半の処理
}

なお、条件を満たした時に、何も処理をせずに即座に次の繰り返しに進む場合、if文の部分を以下のように短縮して書くことができます。

next if (条件);

3.next文を使った例

next文を使った例として、最初にあげた「最近のブログ記事100件の中で、タイトルに『Movable Type』を含む記事だけを抜き出し、そのタイトルを出力する」というプログラムを作ると、以下のようになります。

use MT::Entry;

# 最近のブログ記事を100件読み込めるようにする
my $iter = MT::Entry->load_iter({
               blog_id => 1,
               status => MT::Entry::RELEASE(),
           }, {
               limit => 100,
               sort => 'authored_on',
               direction => 'descend'
           });
# 記事を読み込める間繰り返す
while (my $entry = $iter->()) {
    # 記事のタイトルに「Movable Type」を含まない場合は、
    # 次の繰り返しに進む
    next if ($entry->title !~ /Movable Type/);
    # 記事のタイトルを出力する
    print $entry->title . '<br />';
}

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

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

4~11行目

IDが1番のブログから、最近のブログ記事を100件読み込めるように、「イテレータ」を初期化しています。

13行目

記事がある間、イテレータから記事を読み込んで、変数$entryに割り当てます。

16行目

記事のタイトル($entry->title)に、「Movable Type」が含まれていないかどうかを調べ、含まれていなければ、next文で次の繰り返しに進みます。

18行目

記事のタイトルに「Movable Type」が含まれていれば、if文の条件が成立しないため、繰り返しが続いて、18行目に処理が進みます。
そして、この行によって、記事のタイトル($entry->title)が出力されます。