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; # Create a work area since we can't # modify the existing content of %main. my %work; foreach my $mn ( keys %main ) { foreach my $msec ( sort keys %{$main{$mn}} ) { $work{"$mn-join"}{$msec} = [ @{$main{$mn}{$msec}} ]; } } # Repeatedly multiply matrices (in place). $output_length--; while ($output_length--) { foreach my $mn ( keys %work ) { foreach my $msec ( sort keys %{$work{$mn}} ) { my @store; foreach my $val1 ( @{$work{$mn}{$msec}} ) { foreach my $val2 ( @seed ) { push(@store, "$val1$val2"); } } $work{$mn}{$msec} = \@store; } } } # Merge output with %main. %main = (%main, %work); # Show updated %main. print(Dumper(\%main));