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; } #### roboticus@Boink:~ $ perl return_grep_slice.pl $VAR1 = { 'c' => 'foo' };