配列の差分を取る

たとえば、

my @array_a = (1,2,3,4,5);
my @array_b = (3,4,5,6,7);

とあって、array_aには有るけどarray_bには無い要素だけを取り出したい、というケース。正式には、集合array_aから集合array_bを引いた差集合、とかいう言い方になりますかね。 これを求めるには、以下のようにするとできます。

my @array_c = grep { my $t=$_; ! grep /^$t$/,@array_b; } @array_a;

こうすると、

$ cat tmp.pl
#!/usr/bin/perl
use strict;
use warnings;
my @array_a = (1,2,3,4,5);
my @array_b = (3,4,5,6,7);
my @array_c = grep { my $t=$_; ! grep /^$t$/,@array_b; } @array_a;
print "@array_c\n";
$ perl tmp.pl
1 2

とこんな感じで差分を取ることができます。

同じ理屈で、

my @array_c = grep { my $t=$_; ! grep /^$t$/,@array_b; } @array_a;

こうすれば、両方の配列で重複している要素を取り出すことができます。