foreach
や for
を使用すると、配列やリスト内の要素をひとつずつ処理することができます。foreach
と for
は Perl 内部では同じものとして処理されるので、どちらのキーワードを使っても構いません。Perl を使い慣れてくると、少しでもタイプ数を減らすために for
と書くようになるっぽいです。
以下のコードでは、配列内の要素をひとつずつループで出力します。
my @arr = qw/ AAA BBB CCC /;
for my $val (@arr) {
print "$val\n";
}
上記例では、$val
という制御変数に各要素が格納されて処理されます。この変数を省略して、$_
で参照することもできます。
for (@arr) {
print "$_\n";
}
さらに、foreach (for)
ブロックの中が上記のように単純であれば、次のように一文で書くことができます。この場合は配列変数を括弧で囲む必要はありません。
print "$_\n" for @arr;
for (foreach)
で使用する制御変数の内容を書き換えると、配列内の要素が書き換えられます(map
の制御変数に関しても同様です)。
for my $val (@arr) {
$val += 100; # 配列のすべての要素に 100 を足す
}
# 一行で書くなら
$_ += 100 for @arr;
# こう書くとちょっと冗長
for (@arr) { $_ += 100; }
下記は文字列配列の要素をループで書き換える例です。
# 全要素の文字列内の AAA を BBB に変更
s/AAA/BBB/g for @arr;
# 全要素の文字列内から数字を削除
tr/0-9//d for @arr;
# 全要素の文字列を大文字に変換
$_ = uc $_ for @arr; # $_ = "\U$_" でもOK
インデックスを使って配列の要素をループ処理したい場合は、以下のように 0..$#arr
でインデックスのリストを作ると簡単です。
my @arr = qw/ AAA BBB CCC /;
for (0..$#arr) {
print "$arr[$_]\n";
}
スカラ変数と配列変数の名前空間は分かれているので、制御変数の名前と配列変数の名前は同じものが使えます。
my @who = qw/ Joe Mike Cathy /;
for my $who (@who) {
print "Hello, $who!\n";
}