use strict; our %ids; sub intersect { my %count; my @ret; my $count = scalar keys %ids; foreach my $key (keys %ids) { my %this; for (@{$ids{$key}}) { next if $this{$_}; $count{$_}++; $this{$_}++; if ($count{$_} == $count) { push @ret, $_; } } } undef %ids; return @ret; } $ids{'foo'} = [ 3, 4, 4, 5 ]; $ids{'bar'} = [ 3 ]; $ids{'zoo'} = [ 3, 4, 5 ]; print "[ ",join(', ',intersect)," ]\n"; # prints "[ 3 ]"