You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl提取Uniprot蛋白序列时最后一行重复输出问题排查

问题分析与解决

原代码的问题

  1. 重复打印最后一行序列:原代码在每次循环中都执行print $seq,当读到非序列行时,$seq仍然保留上一次匹配到的序列值,因此会重复输出最后一段序列。
  2. 改用$seq.=$1后重复多次输出:每次匹配到序列行就追加内容到$seq,但循环内每次都打印当前的$seq,导致第一次打印第一段,第二次打印前两段,最终输出完整序列多次叠加的结果。

修正方案

方案一:精准匹配序列行,统一输出

初始化空字符串存储总序列,仅在匹配到序列行时追加内容,循环结束后一次性打印:

#!/usr/bin/perl
open (IN, 'P30988.txt');
my $seq = '';
while (<IN>) {
    if ($_ =~ m/^\s+(\D+)/) {
        my $part = $1;
        $part =~ s/\s//g;
        $seq .= $part;
    }
}
close IN;
print $seq, "\n";

方案二:基于Uniprot格式标记收集序列(更可靠)

Uniprot的txt文件中,序列从SQ行开始,到//行结束,利用这个标记精准收集:

#!/usr/bin/perl
open (IN, 'P30988.txt');
my $seq = '';
my $collecting = 0;
while (<IN>) {
    if (/^SQ/) {
        $collecting = 1;
        next;
    }
    last if (/^\/\//);
    if ($collecting) {
        s/\s//g;
        $seq .= $_;
    }
}
close IN;
print $seq, "\n";

内容的提问来源于stack exchange,提问作者Nickmofoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:31:35