Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 構文
  3. while文

while文 - 繰り返し処理を行う

while文を使うと繰り返し処理を記述することができます。条件が真の間ブロックの中身を繰り返します。

while (条件) {
  ...
}

0~2までの数値を出力

while文を使用して0~2までの数値を出力するサンプルです。while文の最後で変数「$i」をインクリメントしています。「$i」が3になると、条件が偽となるので、whileから抜けます。

# 0~2まで数値を出力
my $i = 0;
while ($i <= 2) {
  print "$i\n";
  $i++;
}

while文とfor文(あるいはforeach文)の違いは何でしょうか?

while文で繰り返しの処理すべてを記述することができますが、for文あるいはforeach文で記述できる場合は、for文あるいはforeach文を使って書いたほうがきれいに書けます。

# for文
for (my $i = 0; $i <= 2; $i++) {
  print "$i\n";
}

# foreach文
foreach my $num (@nums) {
  print "$num\n";
}

補足情報として、Perlにおいてはfor文とforeach文は、まったく同じもので、互いに書き換えることができます。

無限ループを使ったサンプル

whileのよく使う例としては、無限ループの記述があります。条件に1を記述すると、ループが永遠に繰り返されます。

while (1) {
  ...
}

ループを脱出するには、last文を使用します。ループの脱出は、C言語と異なりbreak文ではなく、last文なので注意してください。

以下の例では、配列の要素をpop関数でひとつづつ取り除いていって、配列の要素がなくなった場合に、if文で判定して、last文を使ってwhileブロックを抜けるようにしています。

my @nums = (1, 2, 3);
while (1) {
  if (@nums) {
    pop @nums;
  }
  else {
    last;
  }
}

標準入力/コマンドライン引数から行を順番に読みこむ

while文でよく使う例として、行入力演算子を使って、標準入力あるいは、コマンドライン引数で与えられたファイルから、行を順番に読み込んでみましょう。

# 行読み込み
while (my $line = <>) {
  # 一行目だけスキップ
  next if $. == 1;
  
  # 改行を削除
  chomp $line;
  
  # 処理
  print "Line: $line\n";
}

このサンプルでは、chomp関数を使って、改行を取り除いて、「Line:」をつけて出力しています。

特殊変数「$.」next文を使って、行番号が1行目の時だけ、処理をスキップしています。

このプログラムは以下のように使います。while文と行入力演算子を使うと、簡単にファイルや標準入力から行を読み込むプログラムが書けます。

# コマンドライン引数からファイル名を読み込む場合
perl script.pl file

# 標準入力からパイプを使って読み込む場合
cat file > perl script.pl

これは、複数ファイルでも大丈夫です。

# コマンドライン引数からファイル名を読み込む場合
perl script.pl file1 file2

# 標準入力からパイプを使って読み込む場合
cat file1 file2 > perl script.pl

関連情報

繰り返し処理については、以下で詳しく解説しています。

Perlにはdo ~ while文も存在しますが、next文やlast文がそのままでは使えないので、while文を使うことを強くお勧めします。