use strict; use warnings; use Data::Dumper; my $data1=[ {key=>'a1',value=>'vala1'}, {key=>'a2',value=>'vala2'}, {key=>'a3',value=>'vala3'}, {key=>'b1',value=>'valb1'}, {key=>'b2',value=>'valb2'}, {key=>'c2',value=>'valc2'}, ]; my %ret; #one map %ret = map{ $_->{key} => $_->{value} if($_->{key} =~/^a\d+/) } @$data1; print "map ver\n"; print Dumper \%ret; #grep and map %ret = map{ $_->{key} => $_->{value} } grep{ $_->{key} =~ /^a\d+/ } @$data1; print "grep,map ver\n"; print Dumper \%ret; #foreach %ret=(); foreach my $r (@$data1){ $ret{$r->{key}} = $r->{value} if ( $r->{key} =~ /^a\d+/ ); } print "foreach ver\n"; print Dumper \%ret; #### Odd number of elements in hash assignment at test.pl line 15. map ver $VAR1 = { '' => undef, <====THIS ONE 'a2' => 'vala2', 'a1' => 'vala1', 'a3' => 'vala3' }; grep,map ver $VAR1 = { 'a2' => 'vala2', 'a1' => 'vala1', 'a3' => 'vala3' }; foreach ver $VAR1 = { 'a2' => 'vala2', 'a1' => 'vala1', 'a3' => 'vala3' };