perl 为什么我的最后一行总是输出两次?

jaql4c8m  于 2022-12-04  发布在  Perl
关注(0)|答案(2)|浏览(111)

我有一个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

rqcrx0a6

rqcrx0a61#

下面是重新格式化的代码,并在运算符之间添加了额外的空格,以使语句的运行范围更清楚。

#!usr/bin/perl
open (IN,'P30988.txt');
while (<IN>) {

    if ($_ =~ m /^\s+(\D+)/) {   
        $seq = $1;
        $seq =~ s/\s//g;
    }   

    print $seq;  
}

print命令的位置意味着$seq将在输入文件的 * 每 * 行打印--即使是那些不匹配正则表达式的行。
我怀疑你想要这个

#!usr/bin/perl
open (IN,'P30988.txt');
while (<IN>) {

    if ($_ =~ m /^\s+(\D+)/) {   
        $seq = $1;
        $seq =~ s/\s//g;

        # only print $seq for lines that match with /^\s+(\D+)/
        # Also - added a newline to make it easier to debug

        print $seq . "\n";
    } 
}

当我运行它的时候我得到这个

MRFTFTSRCLALFLLLNHPTPILPAFSNQTYPTIEPKPFLYVVGRKKMMDAQYKCYDRMQ 
QLPAYQGEGPYCNRTWDGWLCWDDTPAGVLSYQFCPDYFPDFDPSEKVTKYCDEKGVWFK 
HPENNRTWSNYTMCNAFTPEKLKNAYVLYYLAIVGHSLSIFTLVISLGIFVFFRSLGCQR 
VTLHKNMFLTYILNSMIIIIHLVEVVPNGELVRRDPVSCKILHFFHQYMMACNYFWMLCE 
GIYLHTLIVVAVFTEKQRLRWYYLLGWGFPLVPTTIHAITRAVYFNDNCWLSVETHLLYI 
IHGPVMAALVVNFFFLLNIVRVLVTKMRETHEAESHMYLKAVKATMILVPLLGIQFVVFP 
WRPSNKMLGKIYDYVMHSLIHFQGFFVATIYCFCNNEVQTTVKRQWAQFKIQWNQRWGRR 
PSNRSARAAAAAAEAGDIPIYICHQELRNEPANNQGEESAEIIPLNIIEQESSA
2q5ifsrm

2q5ifsrm2#

您可以将其简化一点:

while (<IN>) {
    next unless m/^\s/;
    s/\s+//g;
    print;
    }

你想要以空格开始的行,所以立即跳过那些不以空格开头的行。换句话说,快速拒绝你不想要的东西,这与接受你确实想要的东西是不同的。这意味着next之后的所有内容都知道它在处理一个好行。现在if消失了。
你不需要捕获($1)来获得感兴趣的文本,因为该行中唯一的其他文本是前导空格。当你删除所有空格时,前导空格就会消失。这就去掉了if和额外的变量。
最后,打印剩下的内容。如果没有参数,print将使用主题变量$_中的值。
现在,这就更容易管理了。您可以使用if来避免作用域问题,因为if会导致额外的输出,因为没有作用域需要担心。

相关问题