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)