use Benchmark qw(timethese cmpthese countit timestr); my $hash1 = { one => 'One', two => 'One', three => 'One', four => 'One', five => 'One', }; my $hash2 = { one => 'One', four => 'One', five => 'One', }; my $hash3 = {}; for (0..1000) { $hash3->{"foo_$_"} = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } cmpthese (-2,{ forloop => sub { my $hash = {}; foreach my $foo ($hash1, $hash2, $hash3) { foreach my $key (keys %$foo) { $hash->{$key} = $foo->{$key} if ! exists $hash->{$key}; } } }, forloop2 => sub { my $hash = {}; foreach my $foo ($hash3, $hash2, $hash1) { foreach my $key (keys %$foo) { $hash->{$key} = $foo->{$key}; } } }, whileloop => sub { my $hash = {}; foreach my $foo ($hash1, $hash2, $hash3) { while (my($key, $val) = each %$foo) { $hash->{$key} = $val if ! exists $hash->{$key}; } } }, whileloop2 => sub { my $hash = {}; foreach my $foo ($hash3, $hash2, $hash1) { while (my($key, $val) = each %$foo) { $hash->{$key} = $val; } } }, slice => sub { my $hash = {}; foreach my $foo ($hash3, $hash2, $hash1) { @$hash{keys %$foo} = values %$foo; } }, merge => sub { my $hash = {%$hash3, %$hash2, %$hash1}; }, },'auto');