繰り返し処理にラベルを付ける

繰り返し処理の中で繰り返し処理を行っている場合などに、ラベルを付けることで next 演算子や last 演算子を使うときにどの繰り返し処理を対象とするのか指定することができます。ここでは Perl で繰り返し処理に対してラベルを付けて利用する方法について解説します。

(Last modified: )

繰り返し処理にラベルを付ける

last 演算子、 next 演算子、 redo 演算子を使うことで繰り返し処理の中でより細かい制御が出来るようになります。ただこれらの演算子の対象は、演算子が記述されている最も内側の繰り返し処理です。

繰り返し処理が多重になっている場合などに、最も内側の繰り返し処理ではなく対象となる繰り返し処理を指定することができます。この場合は各演算子の後ろに対象となる繰り返し処理に付けられたラベル名を指定します。

last ラベル;
next ラベル;
redo ラベル;

ラベルにはアルファベット・数字・アンダーバーが使用できます。ただし先頭に数字は使用できません。小文字でも大文字でも構わないのですが、 Perl で用意されている関数などと区別するためにラベルには大文字を使うことが推奨されています。

ラベルは予め繰り返し処理で使われるブロックに対して名前を付けるために使用します。ラベルを付けるには各繰り返し処理の前に ラベル: と言う形式で指定します。例えば while 文の場合は次のような形式となります。

ラベル: while (条件式){
  # 何らかの処理
}

このように繰り返し処理のブロックに対して名前を付け、その名前を指定して last 演算子や next 演算子を使用します。例えば次のような使い方となります。

CALC: for (my $i = 1; $i < 10; $i++){
  for (my $j = 1; $j < 10; $j++){
    my $calc = $i * $j;
    print "$i * $j = $calc\n";

    if ($calc > 10){
      last CALC;
    }
  }
}

上記の場合、 for 文が多重となっています。内側の繰り返しの中で掛け算をした結果が 10 よりも大きくなった場合は last 演算子を使って繰り返し処理を終了させています。通常であれば last 演算子が含まれる最も内側の繰り返し処理を終了させるだけですが、今回は場合はラベルを指定して last 演算子を実行していますので、外側の繰り返し処理を対象として last 演算子が実行されます。結果として一番外側の繰り返し処理が終了します。

このようにラベルを使うことでより細かい制御が行えるようになりますが、あまり多用すると複雑で分かりにくいプログラムとなってしまいますので注意して下さい。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

CALC: for (my $i = 1; $i < 10; $i++){
  for (my $j = 1; $j < 10; $j++){

    my $calc = $i * $j;
    print "$i * $j = $calc\n";

    last CALC if $calc > 10;
  }
}

print "End\n";

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

繰り返し処理にラベルを付ける(1)

2 つの変数を乗算した結果を画面に表示します。乗算した結果が 10 よりも大きくなった場合、繰り返し処理を終了します。

-- --

Perl で繰り返し処理に対してラベルを付けて利用する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。