#! perl -slw use strict; use List::Util qw[ min ]; use Data::Dumper; my @site1 = qw[ abcde cdefg efghi ]; my @site2 = qw[ zyxwv xwvut vutrs ]; my %counts; for my $site1 ( @site1 ){ for my $site2 ( @site2 ) { $counts{ substr( $site1, $_, 1 ) . substr( $site2, $_, 1 ) }++ for 0 .. min( length( $site1 )-1, length( $site2 )-1 ); } } print Dumper \%counts; __END__ P:\test>400340.pl $VAR1 = { 'bu' => 1, 'cv' => 2, 'fu' => 2, 'av' => 1, 'hw' => 1, 'ax' => 1, 'du' => 2, 'gv' => 2, 'es' => 1, 'is' => 1, 'ct' => 1, 'iv' => 1, 'gx' => 1, 'fr' => 1, 'cx' => 2, 'dy' => 1, 'az' => 1, 'ev' => 3, 'ez' => 1, 'et' => 2, 'it' => 1, 'dw' => 2, 'hu' => 1, 'dr' => 1, 'ex' => 2, 'fy' => 1, 'cz' => 1, 'by' => 1, 'fw' => 2, 'bw' => 1, 'gs' => 1, 'hr' => 1, 'gt' => 2 };