Perlは問題点の多い言語と言われますが、やはり実用性は本当に高いな、と思う今日このごろ。大きなプログラムを書いても遅くならないし。
さて、2つの配列の積集合(共通する要素)、和集合(いずれか一方または両方に含まれる要素)、差集合(一方にのみ含まれる要素)を求めるには、List::Compare が便利みたいなので試してみた。
#!/usr/bin/perl use List::Compare; # 比較する二つの配列 my @list1 = ('a', 'b', 'c'); my @list2 = ('b', 'c', 'd'); my $lc = List::Compare->new(\@list1, \@list2); # 積集合 (@list1, @list2 両方の配列に含まれる要素) my @intersection = $lc->get_intersection; print "@intersection \n"; # prints b c # 和集合(@list1, @list2 のすべての要素から重複を取り除いたもの) my @union = $lc->get_union; print "@union \n"; # prints a b c d # 差集合 (@list1にのみ含まれる要素) my @list1only = $lc->get_Lonly; print "@list1only \n"; # prints a # 差集合 (@list2にのみ含まれる要素) my @list2only = $lc->get_Ronly; print "@list2only \n"; # prints d
より詳しくは: http://search.cpan.org/dist/List-Compare/lib/List/Compare.pm
差集合だけで良い場合は Array::Diffでも良いみたい。