use strict; use warnings; use Algorithm::Loops qw( MapCar ); my @site1 = qw( AATKKM 123456 ); my @site2 = qw( GGGGGG !@#$%^ ); my $site1; my $site2; my @pairs; my %counts; foreach $site1 (@site1) { my @site1_parts = split(//, $site1); foreach $site2 (@site2) { my @site2_parts = split(//, $site2); MapCar { $counts{$_[0].$_[1]}++ } \@site1_parts, \@site2_parts; } } print($_, ': ', $counts{$_}, $/) foreach (sort keys %counts); __END__ output ====== 1!: 1 1G: 1 2@: 1 2G: 1 3#: 1 3G: 1 4$: 1 4G: 1 5%: 1 5G: 1 6G: 1 6^: 1 A!: 1 A@: 1 AG: 2 K$: 1 K%: 1 KG: 2 MG: 1 M^: 1 T#: 1 TG: 1