我在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个字符)。
有人可以建议如何解决错误吗?
谢谢!
答案 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段)?它实际上几乎涵盖了这种情况,避免了重叠并找到了终止密码子。