$ perl -e '
use Data::Dump;
my %h = qw{cat Tibbles dog Rover kitten Tibbles};
my %r = reverse %h;
dd \%h;
dd \%r;
'
{ cat => "Tibbles", dog => "Rover", kitten => "Tibbles" }
{ Rover => "dog", Tibbles => "cat" }
$ perl -e '
use Data::Dump;
my %h = qw{cat Tibbles dog Rover kitten Tibbles};
my %r = reverse %h;
dd \%h;
dd \%r;
'
{ cat => "Tibbles", dog => "Rover", kitten => "Tibbles" }
{ Rover => "dog", Tibbles => "kitten" }
####
#!/usr/bin/env perl
use strict;
use warnings;
use Benchmark 'cmpthese';
use List::Util 'pairmap';
use Data::Dump;
my %h = qw{mammal cat mollusc snail fish cat};
print "*** Check initial data\n";
dd \%h;
print "*** Check subs return the same value\n";
print "_for\n";
dd _for();
print "_map\n";
dd _map();
print "_pairmap\n";
dd _pairmap();
print "*** Benchmark\n";
cmpthese 0 => {
for => \&_for,
map => \&_map,
pairmap => \&_pairmap,
};
sub _for {
my $result = [];
for my $key (keys %h) {
next unless $h{$key} eq 'cat';
push @$result, $h{$key}, $key;
}
return $result;
}
sub _map {
my $result = [];
@$result = map { $h{$_} eq 'cat' ? ($h{$_}, $_) : () } keys %h;
return $result;
}
sub _pairmap {
my $result = [];
@$result = pairmap { $b eq 'cat' ? ($b, $a) : () } %h;
return $result;
}
####
*** Check initial data
{ fish => "cat", mammal => "cat", mollusc => "snail" }
*** Check subs return the same value
_for
["cat", "fish", "cat", "mammal"]
_map
["cat", "fish", "cat", "mammal"]
_pairmap
["cat", "fish", "cat", "mammal"]
####
*** Benchmark
Rate pairmap map for
pairmap 775527/s -- -33% -42%
map 1154992/s 49% -- -14%
for 1346695/s 74% 17% --
*** Benchmark
Rate pairmap map for
pairmap 779518/s -- -34% -43%
map 1177598/s 51% -- -13%
for 1360223/s 74% 16% --
*** Benchmark
Rate pairmap map for
pairmap 781507/s -- -34% -43%
map 1178381/s 51% -- -14%
for 1364313/s 75% 16% --