まくまくPerlノート
map 演算子を使ってリストの各要素を加工したリストを取得する
2008-02-28

map 演算子を使うと、リストの各要素に対して特定の処理を行った結果をリストで取得できます。map に指定したマッピング式の中で最後に評価された式の値がリストの要素となります(式の値がリストの場合、すべての要素がリストの要素として格納されます)。

# すべての要素を 2 乗した値を得る
my @squares = map { $_ ** 2 } 1..10;

# すべての要素の平方根を得る
my @roots = map { sqrt } 1..10;

ブロック内の式が単純な 1 つの式の場合は、次のようにカンマで区切って簡単に記述することができます(ちなみに、grep 演算子も同様の構文です)。

my @arr = map &hoge() + 1, 1..10;

マッピング式で最後に評価された結果が空リスト () になる場合、map によって生成されるリストに値は追加されません。つまり、grep と同様に値をフィルタリングしながら要素を追加していくことができます。

my @arr = map {
    if ($_ % 10 == 0) {
        $_ + 1;
    } else {
        ();  # 要素追加しない
    }
} 1..100;

この例では、1 から 100 の整数のうち 10 で割り切れるものを取り出し、その値に 1 を足したものをリストの要素として採用しています。結果として、@arr の値は次のようになります。

(11, 21, 31, 41, 51, 61, 71, 81, 91, 101)
2008-02-28