You might want to look at
Algorithm::Loops to generalize the nested-loops solutions that others have offered. Here's a solution in the classical recursive vein.
use warnings;
use strict;
my $HoA = {
flintstones => [ "fred", "barney" ],
jetsons => [ "george", "jane"],
};
use Data::Dumper;
print Dumper
to_AoH(%$HoA);
sub to_AoH {
# For no data, return an empty hashref in an arrayref
@_ or return [{}];
# Otherwise, recursively map the first key's values over
# the AoH of the rest of the list
my ($k, $v_aref, @rest) = @_;
[
map {
my $href = $_;
map {
{%$href, $k => $_}
} @$v_aref
} @{to_AoH(@rest)}
]
}
Updated: simpler base case means simpler code.
Caution: Contents may have been coded under pressure.