use strict; use warnings; use Storable qw / dclone /; #my @data = ( ... ) As shown above; my $data2; for my $href ( @data ) { my $copy_ref = dclone($href); my $sex = $copy_ref->{sex}; delete $copy_ref->{sex}; push @{ $data2->{$sex} }, $copy_ref; } use Data::Dumper; print Dumper $data2;