my ($only_a, $only_b, $only_c, $all, $any) = listy(\@a, \@b, \@c); sub listy { my %tmp1; my @keys; for (0..$#_) { my $key = pop @keys; push @keys, $_, (defined $key ? $key : '') . $_; for my $k (@{$_[$_]}) { $tmp1{$k} .= $_; } } my %tmp2; while (my($k, $v) = each %tmp1) { push @{$tmp2{$v}}, $k; } return @tmp2{@keys}, [keys %tmp1]; }