使用Perl一次迭代字符串3个位置

时间:2012-04-01 15:12:50

标签: regex string perl dna-sequence

我在Perl中编写了以下代码。我想一次遍历字符串3个位置(字符)。如果出现TAATAGTGA(终止密码子),我想打印到终止密码子并删除其余字符。


示例:

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 :(得分:-1)

<强> 脚本:

#!/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

答案 1 :(得分:-2)

我认为这段代码会有用。它根据您的需要使用\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";
  }
}

答案 2 :(得分:-2)

你说你想在第一个终止密码子后删除所有东西。如果是这样,你需要的只是

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

然而,那是神秘的“我想一次遍历一个字符串3个位置(字符)”的要求。这没有任何意义。也许你希望比赛发生在可被3整除的位置?如果是这样,你可以使用

s/^(?:.{3})*?(?:TAA|TAG|TGA)\K.*//;    # Requires 5.10+
s/^((?:.{3})*?(?:TAA|TAG|TGA)).*/$1/;  # Backwards compatible

答案 3 :(得分:-2)

我可以建议阅读perlretut(此处约4段)?它实际上几乎涵盖了这种情况,避免了重叠并找到了终止密码子。