use strict; use warnings; use Data::Dumper; my %config = (a=>undef, b=>0, c=>'foo'); my @wanted = qw(a b c d); my %result = get_small_hash(\%config); sub get_small_hash { my $hr = shift; return map { $_ => $$hr{$_} } grep { exists($$hr{$_}) and defined($$hr{$_}) and $$hr{$_} } @wanted; }