導入
map は「各要素を変換して新しい配列を作る」、grep は「条件に合う要素だけ残す」道具です。ループを書かずに配列をまとめて処理できる、Perl の花形です。
説明
どちらもブロック { ... } の中で、各要素が特殊変数 $_ に入ります。map { 式 } @配列 は式の結果を集め、grep { 条件 } @配列 は条件が真の要素だけを集めます。
use strict;
use warnings;
my @nums = (1, 2, 3, 4, 5, 6);
my @squares = map { $_ * $_ } @nums; # 各要素を2乗
print "@squares\n"; # 1 4 9 16 25 36
my @evens = grep { $_ % 2 == 0 } @nums; # 偶数だけ
print "@evens\n"; # 2 4 6
grep をスカラの文脈で使うと、条件に合った個数が返ります。
use strict;
use warnings;
my @words = ("cat", "elephant", "dog", "ant");
my @long = grep { length($_) >= 4 } @words; # 4文字以上
print "長い単語: @long\n"; # elephant
my $count = grep { length($_) >= 4 } @words; # 個数
print "その数: $count\n"; # 1
やってみよう
map の式や grep の条件を書き換えて、結果がどう変わるか確かめましょう。length($_) の基準を変えるのもおすすめです。
演習
my @n = (1..10); から、grep を使って3より大きい要素だけを取り出し、"@big" の形で表示してください(結果は 4 5 6 7 8 9 10)。
ヒント1を見る
my @big = grep { $_ > 3 } @n; のあと print "@big\n";。