use strict; use warnings; use Data::Dumper; my @data = ( { id => q{1}, name => q{Tom}, sex => q{Male}, }, { id => q{2}, name => q{Harry}, sex => q{Male}, }, { id => q{3}, name => q{Pam}, sex => q{Female}, }, { id => q{4}, name => q{Dick}, sex => q{Male}, } ); my $rhBySex = { Male => [], Female => [] }; push @{ $rhBySex->{ $_->{ sex } } }, { name => $_->{ name }, id => $_->{ id } } for @data; print Data::Dumper->Dumpxs( [ $rhBySex ], [ qw{ rhBySex } ] );