Hi, let me try to explain with my limited knowledge of perl's internal behaviour ;o)
Your solution converts %target and %source into flat lists, combines it to one list and assigns that list to %target...
Grandfather's solution only inserts the key-value pairs from %source into %target, overwriting already existing pairs.
This is less expensive than converting into lists and reassigning these lists.
I tried a benchmark which shows that Grandfather's solution is faster than yours.
I have to admit, that - until this post - I preferred and used the way you presented (mainly because of readability), but now I have to reconsider ;o)
#!/usr/bin/perl
# vim: set ts=4 sw=4 et sta:
use strict;
use warnings;
use Benchmark qw( cmpthese );
my %target;
my %source;
## prefill
@target{'aa'..'zz' } = 'aa' .. 'zz';
@source{'ww'..'yy', 1..100} = ( 'ww'..'yy', 1..100 );
cmpthese( -1, {
grandfather => sub {
my %t = %target;
@t{keys %source} = values %source;
},
sleepyjay => sub {
my %t = %target;
%t = ( %t, %source );
},
});
__END__
Rate sleepyjay grandfather
sleepyjay 598/s -- -62%
grandfather 1585/s 165% --
Rate sleepyjay grandfather
sleepyjay 649/s -- -62%
grandfather 1706/s 163% --
|