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'
}
};