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