#!/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; }