# untested, supports the interface you describe sub commonkeys { my $number_of_hashes = scalar(@_); my %union; my @result; foreach (@_) { foreach (keys %{$_}) { $union{$_}++; } } while (my ($key,$count) = each %union) { if ($count == $number_of_hashes) { # a key which has appeared the same number of times as we have hashes, is present in every hash. push(@result,$key); } } return @result; }