If I've understood correctly I think one approach would break your sequences down into arrays of single letters and shift and compare a letter from each at a time.
use strict; use warnings; use 5.014; open my $inFH, q{<}, \ <<EOD or die $!; atggctgctaggctgtgctgccaactggatcctgcgcgggacgtcctttgtctacgtcccgtcggcgctg +aatcctgcggacgacccctctcgtggtcgcttggggctctgccgccctcttctccgcctgccgttccgg +c atagctgctaggctgtgctgccaactggatcctgcgcgggacgtcctttgtctacgtcccgtcggcgctg +aatcctgcggacgacccctctcgtggtcgtttggggctctgccgccctcttctccgcctgccgttcagg +c atggctgctaggctgtgctgccaactggatcctgcgcgggacgtcctttgtctacgtcccgtcggcgctg +aatcctgcggacgacccctctcgtggtcgcttggggctctgccgccctcttctccgcctgccgttccgg +c atggctgctaggctgtgctgccaactggatcctgcgcgggacgtcctttgtctacgtcccgtcggcgctg +aatcctgcggacgacccctctcgtggtcgcttggggctctaccgccctcttctccgcctgccgttccgg +c EOD chomp( my @sequences = <$inFH> ); close $inFH or die $!; my @letters = map { [ split m{} ] } @sequences; my $consensus = q{}; while ( @{ $letters[ 0 ] } ) { my $seq0 = shift @{ $letters[ 0 ] }; my $seq1 = shift @{ $letters[ 1 ] }; my $seq2 = shift @{ $letters[ 2 ] }; my $seq3 = shift @{ $letters[ 3 ] }; if ( $seq0 eq $seq1 and $seq0 eq $seq2 and $seq0 eq $seq3 ) { $consensus .= $seq0; } else { emitConsensus(); } } emitConsensus(); sub emitConsensus { say $consensus if length $consensus; $consensus = q{}; }
The output.
at gctgctaggctgtgctgccaactggatcctgcgcgggacgtcctttgtctacgtcccgtcggcgctgaat +cctgcggacgacccctctcgtggtcg ttggggctct ccgccctcttctccgcctgccgttc ggc
I hope I have understood correctly and this is helpful.
Cheers,
JohnGG
In reply to Re: Comparing array of aligned sequences
by johngg
in thread Comparing array of aligned sequences
by newtoperlprog
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |