4.9 2つのユニークなリストの和、差、積を求める。

# 配列、ハッシュを初期化
@a = (1, 3, 5, 6, 7, 8);
@b = (2, 3, 5, 7, 9);

@union = @isect = @diff = ();
%union = %isect = ();
%count = ();

## 和集合と積集合を求める簡単な方法
foreach $e (@a) { $union{$e} = 1 }

foreach $e (@b) {
  if ($union{$e}) { $isect{$e} = 1 }
  $union{$e} = 1;
} 
@union = keys %union;
@isect = keys %isect;

## 和集合と積集合を求めるPerl的な方法
foreach $e (@a, @b) { $union{$e}++ && $isect{$a}++ }
@union = keys %union;
@isect = keys %isect;

## 和集合、積集合、差集合を求める方法
foreach $e (@a, @b) { $count{$e}++ }

@union = keys %count;
foreach $e (keys %count) {
  if ($count{$e} == 2) {
    push @isect, $e;
  } else {
    push @diff, $e;
  }
}

## 和集合、積集合、差集合を求める間接的な方法
@isect = @diff = @union = ();

foreach $e (@a, @b) { $count{$e}++ }

@union = keys %count;
foreach $e (keys %count) {
  push @{ $count{$e} ==2 ? \@isect : \@diff }, $e;
}