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;