[perl] mapで条件によってgrepの用に値をとばす。

空の配列 () を返せば、skipされる。

$ perl -e '@a = map { ($_%2) ? 1: () } (1..5);print "values=".join(",",@a)."\n"; print "count=".scalar @a."\n"'
values=1,1,1
count=3

0, undef, ""ではだめ。どれもその値になる。

[kenshin@house4 ~]$ perl -e '@a = map { ($_%2) ? 1: 0 } (1..5);print "values=".join(",",@a)."\n"; print "count=".scalar @a."\n"'
values=1,0,1,0,1
count=5
[kenshin@house4 ~]$ perl -e '@a = map { ($_%2) ? 1: undef } (1..5);print "values=".join(",",@a)."\n"; print "count=".scalar @a."\n"'
values=1,,1,,1
count=5
[kenshin@house4 ~]$ perl -e '@a = map { ($_%2) ? 1: "" } (1..5);print "values=".join(",",@a)."\n"; print "count=".scalar @a."\n"'
values=1,,1,,1
count=5

何もしないのは、0を返していることと同じ。
これは、if文が偽の時は $_%2 の演算結果である0が返っているだけ。

 perl -e '@a = map { if ($_%2){ 1 } } (1..5);print "values=".join(",",@a)."\n"; print "count=".scalar @a."\n"'
values=1,0,1,0,1
count=5


実は空文を返せばskipできる。0を返さないのがちょっと不思議。

perl -e '@a = map { if ($_%2){ 1 }else{} } (1..5);print "values=".join(",",@a)."\n"; print "count=".scalar @a."\n"'
values=1,1,1
count=3