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";