my %HoHoA = ( 'set1' => { 'key1_set1' => [ 'some arrays' ], 'key2_set1' => [ 'some arrays' ], }, 'set2' => { 'key1_set2' => [ 'some arrays' ], 'key2_set2' => [ 'some arrays' ], }, 'set3' => { 'key1_set3' => [ 'some arrays' ], 'key2_set3' => [ 'some arrays' ], }, 'set4' => { 'key1_set4' => [ 'some arrays' ], 'key2_set4' => [ 'some arrays' ], 'key3_set4' => [ 'some arrays' ], }, ); #### key1_set1 - key1_set2 key1_set1 - key2_set2 key1_set1 - key1_set3 key1_set1 - key2_set3 key1_set1 - key1_set4 key1_set1 - key2_set4 key1_set1 - key3_set4 key2_set1 - key1_set2 key2_set1 - key2_set2 key2_set1 - key1_set3 key2_set1 - key2_set3 key2_set1 - key1_set4 key2_set1 - key2_set4 key2_set1 - key3_set4 ... key1_set3 - key1_set4 key1_set3 - key2_set4 key1_set3 - key3_set4 key2_set3 - key1_set4 key2_set3 - key2_set4 key2_set3 - key3_set4 #### foreach my $set ( sort keys %HoHoA) { print "$set\n"; my @key = keys %{$HoHoA{$set}}; for ( my $i = 0; $i<@key; $i++ ) { for (my $j=$i+1; $j<@key; $j++ ) { print "$key[$i] - $key[$j]\n"; } } } # Am I attacking the problem correctly?