sub union { my %seen; @seen{@$_} = () for @_; return keys %seen; } sub intersection { my %seen; for (@_) { $seen{$_}++ for @$_ } return grep $seen{$_} == @_, keys %seen; }