my $count = scalar @$expanded; $expanded = [ map { my $row = $_; map { my $newrow = {%$row}; @$newrow{keys %$_} = values %$_ unless $newrow->{$parent_key}; $newrow } @$expansion ; } @$expanded ]; push @$expanded, @$expansion if $count == scalar @$expanded; #### if ( $expanded->[0]{$parent_key} ) { push @$expanded, @$children; } else { # create cartesian product against existing $expanded $expanded = [ map { my $row = $_; map { my $newrow = {%$row}; # clone expanded row @$newrow{keys %$_} = values %$_; # add in parent_key details $newrow # return new row } @$children; } @$expanded ]; }