#!/usr/bin/perl use strict; use warnings; use Benchmark 'cmpthese'; my %hash = ( foo => 1, bar => 1, baz => 1, one => undef, two => undef, three => undef, ); my ($defined, $undef, $count, @def); sub for_values { defined($_) ? $defined++ : $undef++ for values %hash; } sub grep_values { $defined = scalar (grep defined, values %hash); $undef = scalar (grep !defined, values %hash); } sub grep_subtract { $defined = scalar (grep defined, values %hash); $undef = (scalar keys %hash) - $defined; } sub for_array { $def[ defined $_ ? 1 : 0]++ for values %hash; } cmpthese ( -5, { for => \&for_values, grep => \&grep_values, grep_two => \&grep_subtract, for_array => \&for_array, } ) __END__