まくまくPerlノート
配列の要素をループで処理する
2008-02-28

配列のループ処理の基本

foreachfor を使用すると、配列やリスト内の要素をひとつずつ処理することができます。foreachfor は 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 ループ中に配列の要素の値を書き換える

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";
}
2008-02-28