use Set::Scalar; my %hash_4; my $set_1 = Set::Scalar->new(keys %hash_1); my $set_2 = Set::Scalar->new(keys %hash_2); my $set_3 = Set::Scalar->new(keys %hash_3); my $intersect = $set_1 * $set_2 * $set_3; for my $key (@$intersect) { push @{$hash_4{$key}}, $hash_1{$key}, $hash_2{$key}, $hash_3{$key}; }