#!/usr/bin/perl use strict; use warnings; use Benchmark qw(cmpthese); # create a hash with a few values deviating my $t_count = 3; my %hosts = map { $_ => $t_count - ( rand 50 > 49 ? 1 : 0 ) } (1 .. 1000); my $count = 10_000_000; cmpthese($count, { ' do' => ' do {delete $hosts{$_} unless $hosts{$_} == $t_count} for keys %hosts ', ' map' => ' map {delete $hosts{$_} unless $hosts{$_} == $t_count} keys %hosts ', 'or delete' => ' $hosts{$_} == $t_count or delete $hosts{$_} for keys %hosts ', ' slice' => ' delete @hosts{ grep { $hosts{$_} != $t_count } keys %hosts } ', ' copy' => ' %hosts = map { $hosts{$_} == $t_count ? ($_, $hosts{$_}) : ()} keys %hosts ', });