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;
Task Runner