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でも良いみたい。

