use strict; use warnings; use Data::Dumper; # Inputs. my %main = ( 'main1' => {'m1sec1'=> ['A','B','C'],}, 'main2' => {'m2sec1'=> ['D','E','F'],},); my @seed = ( 'X','Y','Z' ); my $output_length = 3; # Multiply the seed vector with itself as much as requested. my @seedx = @seed; for ( 3 .. $output_length ) { my @input = @seedx; @seedx = (); foreach my $val1 ( @input ) { foreach my $val2 ( @seed ) { push(@seedx, "$val1$val2"); } } } # Multiply vectors against seed matrix. foreach my $mn ( keys %main ) { foreach my $msec ( sort keys %{$main{$mn}} ) { my $store = $main{"${mn}-join"}{$msec} = []; foreach my $val1 ( @{$main{$mn}{$msec}} ) { foreach my $val2 ( @seedx ) { push(@$store, "$val1$val2"); } } } } # Show updated %main. print(Dumper(\%main));