Использование Perl для перебора строки по 3 позиции за раз - PullRequest
1 голос
/ 01 апреля 2012

Я написал следующий код на Perl. Я хочу перебрать строку 3 позиции (символы) одновременно. Если появляются TAA, TAG или TGA (стоп-кодоны), я хочу печатать до стоп-кодонов и удалять остальные символы.


Пример:

data.txt

ATGGGTAATCCCTAGAAATTT

ATGCCATTCAAGTAACCCTTT

Ответ:

ATGGGTAATCCCTAG (последние 6 символов удалены)

ATGCCATTCAAGTAA (последние 6 символов удалены)

(каждая последовательность начинается с ATG).


Код:

#!/usr/bin/perl -w

open FH, "data.txt";
@a=<FH>;

foreach $tmp(@a)
{
  for (my $i=0; $i<(length($tmp)-2); $i+=3)
  {
    if ($tmp=~/(ATG)(\w+)(TAA|TAG|TGA)\w+/)
    {
      print "$1$2$3\n";
    }
    else 
    { 
      print "$tmp\n"; 
    }
    $tmp++;
  }
}
exit;

Однако мой код не дает правильного результата. Не должно быть никаких совпадений в символах (я хочу перемещать каждые 3 символа).

Может кто-нибудь подсказать, как исправить ошибку?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 02 апреля 2012

Могу ли я предложить чтение perlretut (примерно в 4 абзацах ниже)?На самом деле он почти полностью охватывает эту ситуацию, избегая дублирования и находя стоп-кодоны.

0 голосов
/ 01 апреля 2012

Я думаю, этот код подойдет. Он использует \w{3} - трехсимвольные кодоны, как вам нужно.

#!/usr/bin/perl -w
open FH, "data.txt";
@a=<FH>;
foreach $tmp(@a) {
  if ($tmp=~ /^(ATG(?:\w{3})*(?:TAA|TAG|TGA)).*/) {
    print "$1\n";
  } else {
    print "$tmp\n";
  }
}
0 голосов
/ 01 апреля 2012

Вы говорите, что хотите удалить все после первого стоп-кодона.Если это так, то все, что вам нужно, это

while (<FH>) {
   s/(?<=TAA|TAG|TGA).*//;
   print;
}

Но есть мистическое требование: «Я хочу перебрать строку из 3-х позиций (символов) за раз».Это не имеет никакого смысла.Возможно, вы хотите, чтобы матч происходил в позиции, которая делится на три?Если это так, вы бы использовали

s/^(?:.{3})*?(?:TAA|TAG|TGA)\K.*//;    # Requires 5.10+
s/^((?:.{3})*?(?:TAA|TAG|TGA)).*/$1/;  # Backwards compatible
0 голосов
/ 01 апреля 2012

Сценарий:

#!/usr/bin/perl

use strict;
use warnings;

open FH, "data.txt";
my @a = <FH>;

foreach (@a) {
  print /^(ATG(...)*?(TAA|TAG|TGA))/? $1 : $_, "\n";
}

Выход:

ATGGGTAATCCCTAG
ATGCCATTCAAGTAA
...