Все зависит от того, хотите ли вы генерировать последовательности, которые могут перекрываться. Например, последовательность AF038954 содержит atgaccatcctccagacatacttccggcagaacagggatga
, конец которой перекрывается с atgaagtcttggacaacctcttggcttttgtctgtga
. Вы хотите сообщить о них обоих?
Если вы не хотите сообщать о последовательностях, которые перекрываются, это очень простая проблема, которую вы можете решить с помощью одного регулярного выражения:
while (<DATA>) {
chomp;
print "processing $_\n";
my ($id, $rna_sq) = split;
while ($rna_sq =~ /(atg.*?(?:tga|taa|tag))/g) {
printf "\t%8s %4i %4i %s %i\n",
$id,
pos($rna_sq) - length($1) + 1,
pos($rna_sq),
$1,
length($1);
}
}
Регулярное выражение (atg.*?(?:tga|taa|tag))
соответствует вашему необходимому началу, затем как можно меньше из того, что будет дальше (это ?
, чтобы остановить .*
быть "жадным"), затем к вашему требуемому концу. Итерирование по нему с помощью цикла while
перезапускает после этого совпадения, что отвечает требованию не искать перекрытия.
Если вы хотите хотите, чтобы сообщалось о перекрывающихся последовательностях, вам нужен двухэтапный процесс: найдите начало, найдите конец, а затем найдите другой старт, подбирая с того места, где вы остановились, в поисках начала. последний раз. Но вы все равно можете выполнить более простую работу, используя второе регулярное выражение:
while (<DATA>) {
chomp;
print "processing $_\n";
my ($id, $rna_sq) = split;
while ($rna_sq =~ /atg/g) {
if ($' =~ /(.*?(?:tga|taa|tag))/) {
my $match = "atg$1";
printf "\t%8s %4i %4i %s %i\n",
$id,
pos($rna_sq) - 2,
pos($rna_sq) - 3 + length($match),
$match,
length($match);
}
}
}
Здесь мы используем (обычно не рекомендуется) $'
специальную переменную, которая содержит содержимое после совпадения. Мы смотрим в этом, чтобы найти конец последовательности и вывести детали. Поскольку наше основное глобальное совпадение с $rna_seq
не включает в себя последовательность (как и выше), мы возобновляем поиск с начала, на котором прервался предыдущий поиск, то есть сразу после найденного начала. Таким образом, мы делаем включаем перекрывающиеся последовательности.