Я хочу выяснить максимально длинную последовательность белка, переведенную с компакт-дисков в 6 прямой и обратной рамке.
Это пример входного формата:
>111
KKKKKKKMGFSOXLKPXLLLLLLLLLLLLLLLLLMJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX
>222
WWWMPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMPPPPPXKKKKKK
Я хотел бы узнать все строки, которые начинаются с "M" и заканчиваются на "X", подсчитайте каждую длинустроки и выберите самую длинную.
Например, в случае, указанном выше:
, который найдет скрипт,
>111 has two matches:
MGFSOX
MJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX
>222 has one match:
MPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMPPPPPX
Затем подсчитайте длину каждого совпадения и напечатайте строкуи количество самых длинных совпадений, что является результатом, который я хочу:
>111
MJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX 32
>222
MPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMPPPPPX 38
Но он не выводит ответа.Кто-нибудь знает как это исправить?Любое предложение будет полезно.
#!/usr/bin/perl -w
use strict;
use warnings;
my @pep=();
my $i=();
my @Xnum=();
my $n=();
my %hash=();
my @k=();
my $seq=();
$n=0;
open(IN, "<$ARGV[0]");
while(<IN>){
chomp;
if($_=~/^[^\>]/){
@pep=split(//, $_);
if($_ =~ /(X)/){
push(@Xnum, $1);
if($n >= 0 && $n <= $#Xnum){
if(@pep eq "M"){
for($i=1; $i<=$#pep; $i++){
$seq=join("",@pep);
$hash{$i}=$seq;
push(@k, $i);
}
}
elsif(@pep eq "X"){
$n=$n+1;
}
foreach (sort {$a cmp $b} @k){
print "$hash{$k[0]}\t$k[0]";
}
}
}
}
elsif($_=~/^\>/){
print "$_\n";
}
}
close IN;