use strict; use warnings; my @sequences = qw(ACGCATTCA ACTGGATAC TCAGCCATC); my %matches; for my $outer (0 .. $#sequences - 1) { for my $inner ($outer + 1 .. $#sequences) { my $mask = $sequences[$outer] ^ $sequences[$inner]; next if index ($mask, "\0") == -1; # No matching characters $mask =~ tr/\0/\xff/c; $mask |= $sequences[$outer]; $mask =~ tr/\xff/./; push @{$matches{$mask}}, [$outer + 1, $inner + 1]; } } for my $match (sort keys %matches) { print "$match pattern between ", join (', ', map {"$_->[0] and $_->[1]"} @{$matches{$match}}), "\n"; }