{{tag> note:perl map grep splice for}} ---json { "title":"mapとgrepを比べる", "description":"mapとgrepを比べる" } --- \\ ==== mapとgrepを比べる(map/grep) ==== \\ === (1) 特定の値の削除(grepを使う) === grepは条件に該当するものの値は返し、該当しないものは返さない。\\ use Data::Dumper; @order = (3, 4 ,6); $delete_value = 4; # 削除する値 @order = grep { $_ != $delete_value } @order; print Dumper(@order)."\n"; 結果\\ $VAR1 = 3; $VAR2 = 6; === (2) 特定の値の初期化(mapを使う) === mapは条件に該当するものと該当しないものを区別して返す。\\ use Data::Dumper; @order = (3, 4 ,6); $delete_value = 4; # 削除する値 @order = map { $_ != $delete_value ? $_ : undef } @order; print Dumper(@order)."\n"; 結果\\ $VAR1 = 3; $VAR2 = undef; $VAR3 = 6; === (3) 特定の値の削除(grepを使わずspliceとforを使う) === spliceは要素位置を指定して削除することができるが、値に一致したものを削除するためには、値の該当する要素位置を調べる必要がある。\\ 先頭から後方に進むと、削除したときに評価対象の位置がくるってしまうので、後方から先頭に向かって処理するところがポイント。\\ use Data::Dumper; @order = (3, 4 ,6); $delete_value = 4; # 削除する値 for (my $i=$#order; $i>=0; $i--) { splice(@order, $i, 1) if ($order[$i] == $delete_value); } print Dumper(@order)."\n"; 結果\\ $VAR1 = 3; $VAR2 = 4; $VAR3 = 6; $VAR1 = 3; $VAR2 = 6; $VAR1 = 3; $VAR2 = 6; $VAR1 = 3; $VAR2 = 6; ~~DISCUSSION~~