use Data::Dumper; my $h = { 1 => { nick => 'rbush', phone => '5551212', bday => '3/12/1965', }, 3 => { nick => 'ernest', phone => '5553300', bday => '3/12/1971', }, 5 => { nick => 'fred', phone => '1112300', bday => '5/01/1972', }, }; sub hmap (&%) { my $code = shift; my @i = @_; local @_; my @rv; push @rv, $code->(@_=(shift @i,shift @i)) while @i; @rv; } my %new = hmap { $_[1]{nick} =~ /rbush|fred/ ? ($_[0], $_[1]) : () } %$h; my %new2 = hmap { $_[1]{nick} =~ /rbush|fred/ ? ($_[0], hmap { $_[0], $_[1] } %{$_[1]}) : () } %$h; print "new = " . Dumper (\%new) . "\n"; print "new2 = " . Dumper (\%new2) . "\n"; #### owncloselady-lm:scratch rbush$ perl hmap_ex1.pl new = $VAR1 = { '1' => { 'nick' => 'rbush', 'bday' => '3/12/1965', 'phone' => '5551212' }, '5' => { 'nick' => 'fred', 'bday' => '5/01/1972', 'phone' => '1112300' } }; new2 = $VAR1 = { 'rbush' => 'bday', '1' => 'nick', '3/12/1965' => 'phone', 'nick' => 'fred', 'phone' => '1112300', 'bday' => '5/01/1972', '5551212' => '5' }; #### use Data::Dumper; my $h = { 1 => { nick => 'rbush', phone => '5551212', bday => '3/12/1965', }, 3 => { nick => 'ernest', phone => '5553300', bday => '3/12/1971', }, 5 => { nick => 'fred', phone => '1112300', bday => '5/01/1972', }, }; sub hmap { my ($h, $code) = @_; return undef unless defined $h; my $rv = {}; while (my ($k, $v) = each %$h) { my $x = &$code($k, $v); $rv->{$k} = $x if (defined $x); } return $rv; } my $new = hmap $h, sub { $_[1]->{nick} =~ /rbush|fred/ ? $_[1] : undef }; my $new2 = hmap $h, sub { return hmap $_[1]->{nick} =~ /rbush|fred/ ? $_[1] : undef, sub { $_[0] =~ /nick|phone/ ? $_[1] : undef } }; print "new = " . Dumper ($new) . "\n"; print "new2 = " . Dumper ($new2) . "\n"; #### owncloselady-lm:scratch rbush$ perl hmap_ex2.pl new = $VAR1 = { '1' => { 'nick' => 'rbush', 'bday' => '3/12/1965', 'phone' => '5551212' }, '5' => { 'nick' => 'fred', 'bday' => '5/01/1972', 'phone' => '1112300' } }; new2 = $VAR1 = { '1' => { 'nick' => 'rbush', 'phone' => '5551212' }, '5' => { 'nick' => 'fred', 'phone' => '1112300' } };