Вы уже проверили BioPerl ?Я не проверял, но, возможно, он уже включает в себя функции, которые вам требуются.Или вы сейчас работаете над заданием, для которого вам нужно написать программу самостоятельно?
РЕДАКТИРОВАТЬ
Я не совсем уверен в первом разделе кодаВы отправили.Например, в ваших регулярных выражениях есть пробелы.Включает ли строка, которую вы пытаетесь сопоставить, эти пробелы или все кодоны записаны вместе, как в AUGCCGGAUGA
?В последнем случае просто не будет совпадения, даже если присутствуют искомые кодоны (я, вероятно, говорю вам то, что вы знаете, хотя ... Я просто хотел указать на это, на всякий случай :)).
Кроме того, каков код вашей pos
функции?
Еще одна вещь: вам не нужно устанавливать $_
, вы можете просто сопоставить $RNA_seq
сшаблон, вот так:
if ($RNA_seq =~ m/UGA/) { # ...
РЕДАКТИРОВАТЬ 2
Я подумал немного больше о первом разделе, я думаю, что использование функции index
будетздесь рекомендуется, так как это сразу дает вам позицию в последовательности:
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw( min );
my $string = 'UGAAUGGGCCAUAUUUGACUGAGUUUCAGAUGCCAUUGGCGAUUAG';
# the genes: *-------------* *---------------*
my $prev = -1;
my @genes;
while (1) {
my $start = index($string, 'AUG', $prev+1);
my $stop = min grep $_ > -1, (index($string, 'UGA', $start+1), index($string, 'UAA', $start+1),
index($string, 'UAG', $start+1));
# exit the loop if index is -1, i.e. if there was no more match
last if ($start < 0 or $stop < 0);
# using +1 so that 'AUGA' will not count as a gene
if ($stop > $start+1) {
push @genes, substr($string, $start, $stop);
}
$prev = $stop; # I'm assuming that no second AUG will come between AUG and a stop codon
}
print "@genes\n";
Это дает вам
AUGGGCCAUAUUUGA AUGCCAUUGGCGAUUAG
Я бы сказал, что, возможно, потребуется некоторое уточнение, но я надеюсь, что это будетбудь полезным все равно.