Perl提取Uniprot蛋白序列时最后一行重复输出问题排查
问题分析与解决
原代码的问题
- 重复打印最后一行序列:原代码在每次循环中都执行
print $seq,当读到非序列行时,$seq仍然保留上一次匹配到的序列值,因此会重复输出最后一段序列。 - 改用
$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
相关产品推荐
相关产品推荐

