my $seq = [ [ qw(A C G C A T T C A) ], [ qw(A C T G G A T A C) ], [ qw(T C A G C C A T C) ], [ qw(C T G G A T C G C) ] ]; #### ..G.AT... occurs in 0,3 ...G....C occurs in 1,2,3 .C......C occurs in 1,2 A.....T.. occurs in 0,1 ........C occurs in 1,2,3 ...G..... occurs in 1,2,3 A........ occurs in 0,1 ....AT... occurs in 0,3 AC....... occurs in 0,1 ..G.A.... occurs in 0,3 ..G..T... occurs in 0,3 .C.G....C occurs in 1,2 ..G...... occurs in 0,3 ......T.. occurs in 0,1 .C.G..... occurs in 1,2 .C....T.. occurs in 0,1 AC....T.. occurs in 0,1 .....T... occurs in 0,3 ....A.... occurs in 0,3 .C....... occurs in 0,1,2 #### my %maxMatch; for my $key (keys %$match) { @{$match->{$key}} = uniq @{$match->{$key}}; my $seqSet = join ",", @{$match->{$key}}; unless ($maxMatch{$seqSet}) { $maxMatch{$seqSet} = $key; next; } my $old = true { /[^\.]/ } split //, $maxMatch{$seqSet}; my $new = true { /[^\.]/ } split //, $key; $maxMatch{$seqSet} = $key if $new > $old; } for my $key (keys %maxMatch) { print $maxMatch{$key}, " occurs in $key \n"; } #### ..G.AT... occurs in 0,3 .C.G....C occurs in 1,2 ...G....C occurs in 1,2,3 .C....... occurs in 0,1,2 AC....T.. occurs in 0,1