【Perl】for/foreach/whileの使い分け

まずはforeachで書けないか考える

まず最初にforeachを使って書けないかを考える。foreachはループを最も簡単に書けるので、foreachで十分なのであれば、foreachを使う。foreachは繰り返しをするための条件を指定することができない。

my @animals = ('Cat', 'Dog', 'Mouse');

foreach my $animal (@animals) {
  print "$animal\n";
}


要素番号が必要なときは通常のfor文

次に要素番号が必要な場合があるとする。そのときは通常のfor文を使う。次のサンプルプログラムは、要素番号と配列の要素を出力するものになっている。「@animals」をスカラコンテキストで評価すると、配列の長さが取得できることに注意する。

my @animals = ('Cat', 'Dog', 'Mouse');

for (my $i = 0; $i < @animals; $i++) {
  my $animal = $animals[$i];
  print "$i : $animal\n";
}


要素番号を増やしていかないような繰り返しはwhile文

while文は、for文と異なり「ループする条件」の部分しか持たない。

1. ファイルから行を読み込む
ファイルから行を読み込む場合はwhile文を使用する。

while (my $line = <>) {
  print $line;
}



2. 配列をpopする
配列をpop関数を使って取り出してなくなったら終わりというような処理はwhile文で書く。

my @animals = ('Cat', 'Dog', 'Mouse');

while (my $animal = pop @animals) {
  print "$animal\n";
}


結論

要素番号が必要ならforを使用する。要素番号は不要だが、ループするにあたって、指定した条件に一致しない場合ループさせたくないようなときはwhileを使用する。前述した内容一致しない場合はforeachを使用する。


参考:for/while文を使った繰り返し処理 - Perlゼミ(サンプルコードPerl入門)