use Data::Dumper; my @ary_of_hrefs = ( { id_1 => 'a', id_2 => 'b', f1 => 'p', f2 => 'i' }, { id_1 => 'a', id_2 => 'c', f1 => 'e', f2 => 'm' }, { id_1 => 'b', id_2 => 'b', f1 => 'r', f2 => 'h' }, { id_1 => 'b', id_2 => 'c', f1 => 'l', f2 => 'o' } ); my %hash; map { $hash{ delete $_->{id_1} }{ delete $_->{id_2} } = $_ } @ary_of_hrefs; print Dumper(\%hash), "\n"; #### $VAR1 = { 'a' => { 'b' => { 'f1' => 'p', 'f2' => 'i' }, 'c' => { 'f1' => 'e', 'f2' => 'm' } }, 'b' => { 'b' => { 'f1' => 'r', 'f2' => 'h' }, 'c' => { 'f1' => 'l', 'f2' => 'o' } } }; #### for ( @ary_of_hrefs ) { $hash{ delete $_->{id_1} }{ delete $_->{id_2} } = $_; }