$ 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% --