sub enumerate { # base case: return an array containing a single # empty anonymous hash (ref). return ( +{} ) unless @_; # general case my %p = @_; my ( $key, $val ) = each %p; my @ret; delete $p{ $key }; for my $h ( enumerate( %p ) ) { # recursion for my $d ( @$val ) { my %c = %$h; # copy hash $c{ $key } = $d; push @ret, \%c; } } return @ret; }