grepとmap

back
grep EXPR, LIST
grep BLOCK, LIST

LISTの中身を$_にセットし、式を評価。真になった値のリストを返す。

@b = grep $_<5, @a;
(リストの5未満のみが新リストになる)


foreach (@a) {
  if ($_ < 5) {
    push @b, $_;
  }
}
と同じ、かな。


-----------------------------------------------------


map EXPR, LIST
map BLOCK, LIST

LISTの中身を$_にセットし、式を評価。その結果を返す。

@b = map $_<5, @a;
(5未満の場合は1、以上の場合は undef が代入)

という使い方ではなく(笑)、配列の各要素に同じ処理を行い時に使用。

@b = map uc, @a;
@aの各要素の文字列を全部大文字に。


foreach (@a) {
  push @b, uc $_;
}
と同じ、と思う。

map print, @a
map { print "$_\n" } @a;
@aの各要素を出力(あんまり褒められた使い方ではないケド)



---------------------------------------
ただし、処理する内容(使う関数など)によっては、
「引数の値を処理した結果を返すもの」と「引数の値そのものを変更するもの」があるので、
使い分けが必要。

(例) 各配列要素の末尾の改行コードを削除する

@b = grep { chomp } @a;

chomp は 引数(この場合 $_ に代入された @a の要素)の末尾の改行コードを
削ったものを、また引数へ格納するので、map では期待する動作をしない。
さらにこの場合、$_ を書き換えているので、@a の要素も改行コードが削られる。

とゆーか、このばあいは
@b = @a;
chomp @b;
で良い(笑)


まぁ、foreach とうまく使い分けろってことだ。

back