本文へスキップ
BecomeCoder

Perlコース · 第4章 配列 · レッスン15

map と grep ― 変換とふるい分け

ブラウザで完結

導入

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";

実際に動かしてみよう

下のエディタにPerlを書いて「実行」を押すと、学習用シミュレータが print / say の出力を表示します(本物のperlではなく、教材の範囲を再現した軽量なエンジンです)。スカラ/配列/ハッシュ・制御構文・サブルーチン・正規表現(=~ / s///)なども動きます。本文の例を書き換えて動かしてみましょう(ファイル入出力・リファレンス・CPANモジュールなど一部の機能は対象外です)。

Perl — ブラウザ内で実行(学習用シミュレータ)

Perlの教材サブセットを動かす学習用シミュレータを読み込みます(本物のperlではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。