Perlで、ある配列から順序そのままで別の配列の重複除いた配列を作る

Perlである配列から、順番はそのままで別の配列に含まれる要素を除いたリストを作りたかったけど、すぐ出来なかったのでメモ

例えば、以下のfoo, barが与えられたとき、

foo = (1,2,3,4,5,6)

bar = (1,3,6)

次のようなbazを手に入れたい。

baz = (2,4,5)

簡単なのはfooとbarをハッシュにしてしまって統合することだけど、順番も保証したい。

答え

my @foo = (1,2,3,4,5,6);
my @bar = (1,3,6);
my %bar = map { $_ => 1} @bar;
my @baz = grep { !$bar{ $_ } } @foo;

ポイントは、最終的に重複を消したい方の配列はそのままで、もう一つの配列をハッシュにすること。こうすれば、取り出した要素は元の順になる。

一番最後の行はこれでも行けるはず(未確認)

my @baz = grep { $_ != $bar{ $_ } } @foo;