use strict; use warnings; use Data::Dumper; my @ary_of_hrefs = ({id_1=>'A',id_2=>'B'},{id_1=>'V',id_2=>'Z'}); my %hash = map { delete $_->{id_1} => { delete $_->{id_2} => $_ } } @ary_of_hrefs; print Dumper \%hash; my $hash; foreach my $href ({id_1=>'A',id_2=>'B'},{id_1=>'V',id_2=>'Z'}) { my $id_1 = delete $href->{id_1}; my $id_2 = delete $href->{id_2}; $hash->{$id_1}->{$id_2} = $href; } print Dumper \$hash; __output__ $VAR1 = { 'A' => { 'B' => {} }, 'V' => { 'Z' => {} } }; $VAR1 = \{ 'A' => { 'B' => {} }, 'V' => { 'Z' => {} } };