1

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


例子:

数据.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

4 回答 4

-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
于 2012-04-01T15:49:05.530 回答
-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";
  }
}
于 2012-04-01T15:53:56.163 回答
-2

你说你想删除第一个终止密码子之后的所有内容。如果是这样,您所需要的只是

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
于 2012-04-01T15:56:27.767 回答
-2

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

于 2012-04-01T23:46:48.057 回答