我有一个uniprot文档,里面有一个蛋白质序列和一些元数据。我需要使用perl来匹配序列并打印出来,但由于某种原因,最后一行总是出现两次。我写的代码在这里
#!usr/bin/perl
open (IN,'P30988.txt');
while (<IN>) {
if($_=~m /^\s+(\D+)/) { #this is the pattern I used to match the sequence in the document
$seq=$1;
$seq=~s/\s//g;} #removing the spaces from the sequence
print $seq;
}
我尝试了$seq.=$1;
,但是它打印了序列4.5次。我确定我在这里犯了一个错误,但是不确定是什么。下面是输入文件https://www.uniprot.org/uniprot/P30988.txt
2条答案
按热度按时间rqcrx0a61#
下面是重新格式化的代码,并在运算符之间添加了额外的空格,以使语句的运行范围更清楚。
print
命令的位置意味着$seq
将在输入文件的 * 每 * 行打印--即使是那些不匹配正则表达式的行。我怀疑你想要这个
当我运行它的时候我得到这个
2q5ifsrm2#
您可以将其简化一点:
你想要以空格开始的行,所以立即跳过那些不以空格开头的行。换句话说,快速拒绝你不想要的东西,这与接受你确实想要的东西是不同的。这意味着
next
之后的所有内容都知道它在处理一个好行。现在if
消失了。你不需要捕获(
$1
)来获得感兴趣的文本,因为该行中唯一的其他文本是前导空格。当你删除所有空格时,前导空格就会消失。这就去掉了if
和额外的变量。最后,打印剩下的内容。如果没有参数,
print
将使用主题变量$_
中的值。现在,这就更容易管理了。您可以使用
if
来避免作用域问题,因为if
会导致额外的输出,因为没有作用域需要担心。