I think this does it? And should handle your real data without problems.
Updated: see comment for the one-line change.
#! perl -slw
use strict;
use Data::Dumper;
sub combs {
my @inputs = @_;
my @saved = my @index = map{ scalar $#$_ } @inputs;
my $next = $#index;
return sub{
if( $index[ 0 ] == -1 ) {
@index = @saved;
return ();
}
my $rv = [ map{ $inputs[ $_ ][ $index[ $_ ] ] } 0 .. $#inputs
+];
if( $index[ $next ] ) {
$index[ $next ]--;
}
else {
$next-- until $index[ $next ] or $next == 0;
$index[ $next++ ]--;
@index[ $next .. $#index ] = @saved[ $next .. $#index ];
$next = $#index;
}
return $rv;
}
}
sub Cnr{
my $n = shift;
return [] unless $n--;
map{
my $x = $_;
map{ [ $_[$x], @$_ ] } Cnr( $n, @_[ ($x + 1) .. $#_ ] );
} 0 .. ($#_ - $n);
}
my $HoA = {
flintstones => [ "fred", "barney" ],
jetsons => [ "george", "jane"],
domo => [ "harry", "gato" ],
};
my $AoH = [
map {
my @array;
my $iter = combs @{ $HoA }{ @$_ };
while( my $vals = $iter->() ) {
my %hash;
@hash{ @$_ } = @$vals;
push @array, \%hash;
}
@array;
} Cnr scalar keys %{ $HoA }, keys %{ $HoA }
## } Cnr 2, keys %{ $HoA } ##Replaced
];
print Dumper $AoH;
__END__
P:\test>504165
$VAR1 = [
{
'flintstones' => 'barney',
'jetsons' => 'jane',
'domo' => 'gato'
},
{
'flintstones' => 'barney',
'jetsons' => 'jane',
'domo' => 'harry'
},
{
'flintstones' => 'fred',
'jetsons' => 'jane',
'domo' => 'gato'
},
{
'flintstones' => 'fred',
'jetsons' => 'jane',
'domo' => 'harry'
},
{
'flintstones' => 'barney',
'jetsons' => 'george',
'domo' => 'gato'
},
{
'flintstones' => 'barney',
'jetsons' => 'george',
'domo' => 'harry'
},
{
'flintstones' => 'fred',
'jetsons' => 'george',
'domo' => 'gato'
},
{
'flintstones' => 'fred',
'jetsons' => 'george',
'domo' => 'harry'
}
];
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.