my %main = ( 'main1' => {'m1sec1'=> ['A','B','C'],}, 'main2' => {'m2sec1'=> ['D','E','F'],},); my %seed = ( 'seed' => {'seed1'=> ['X','Y','Z']},); #### my %main = ( 'main1' => {'m1sec1'=> ['A','B','C'],}, 'main2' => {'m2sec1'=> ['D','E','F'],}, 'main1-join' => { 'm1sec1'=> ['AX','BX','CX', 'AY','BY','CY', 'AZ','AY','AZ'], }, 'main2-join' => { 'm2sec1'=> ['DX','EX','FX', 'DY','EY','FY', 'DZ','EZ','FZ], } ); #### use Data::Dumper; my %nhash; foreach my $sd ( keys %seed ) { foreach my $sdsub ( sort keys %{$seed{$sd}} ) { my %temphash; foreach my $valseed ( @{$seed{$sd}{$sdsub}} ) { my $join; INNER: foreach my $mn ( keys %main ) { foreach my $msec ( sort keys %{$main{$mn}} ) { my @store; foreach my $valmain( @{$main{$mn}{$msec}} ) { #print $valmain.$valseed,"\n"; $join = $valmain.$valseed; push @store,$join; last INNER if (length($join) > 2); } $temphash{$msec} = [ @store ]; $main{$mn."-join"} = {%temphash}; } } #print "$valseed\n"; } } } print Dumper \%main ;