use feature 'postderef'; # Needed in perl 5.20 and 5.22 my @aoh = ( { id_1 => "F1", id_2 => "F2", v => "FV" }, { id_1 => "S1", id_2 => "S2", v => "SV" }, { id_1 => "T1", id_2 => "T2", v => "TV" }, ); my %hash; foreach my $href (@aoh) { my ($id_1, $id_2) = delete $href->@{'id_1', 'id_2'}; $hash{$id_1}{$id_2} = $href; }