请教perl文本处理问题

kingwmj78 2010-09-24 02:39:52
我要对一个文本进行处理,要把有特征词polymorphism的行输出到另一个文件。原文件的格式是这样的:
Disease variants: 20001
Polymorphisms: 36549
Unclassified variants: 5717
Total: 62267

Main Swiss-Prot Seq AA Type of
gene name Entry name AC FTId pos change variant dbSNP Disease name
_________ ___________________ __________ _____ ______ ____________ __________ _____________________
A1BG A1BG_HUMAN P04217 VAR_018369 52 R -> H Polymorphism rs893184 -
A1CF A1CF_HUMAN Q9NQ94 VAR_052201 555 V -> M Polymorphism rs9073 -
A4GALT A4GAT_HUMAN Q9NPC4 VAR_014297 183 M -> K Unclassified - -
A4GALT A4GAT_HUMAN Q9NPC4 VAR_017508 187 G -> D Polymorphism rs28940572 -
A4GNT A4GCT_HUMAN Q9UNA3 VAR_022096 218 A -> D Polymorphism rs2246945 -
AAAS AAAS_HUMAN Q9NRG9 VAR_012804 15 Q -> K Disease - Achalasia-addisonianism-
AAAS AAAS_HUMAN Q9NRG9 VAR_037060 108 K -> M Polymorphism rs13330 -
AAAS AAAS_HUMAN Q9NRG9 VAR_012805 160 H -> R Disease - Achalasia-addisonianism-

另外还有很多行,这只是一小部分,我用perl写出如下代码:

use warnings;
open IN, "<humsavar.txt";

open OUT, ">Polymorphism.txt";
select OUT;
while(<IN>)
{$lines=<IN>;
if($lines=~m/.*Polymorphism.*/i)
{ print "$lines";
}
}
close IN;
close OUT;

最后得到的结果是18307条结果,但实际结果是36549,我始终找不出问题出在哪里,求高手指教啊。
PS:虽然用excel排序的方法也能解决,但我还是觉的perl好一些,因为还有其他的数据要同样处理,那些情况下excel就不行了。
...全文
111 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingwmj78 2010-09-25
  • 打赏
  • 举报
回复
谢谢楼上的几位
wesleyluo 2010-09-25
  • 打赏
  • 举报
回复
楼上的牛!
iambic 2010-09-24
  • 打赏
  • 举报
回复
<IN>存到$_里是语言定义的行为。你想存到$line里就再加行$line = $_,或者在while里就写while ($line = <IN>)。不过这都是多此一举了。你直接这样写岂不省事?
while(<IN>)
{
print if /Polymorphism/i;
}

guoxuqu 2010-09-24
  • 打赏
  • 举报
回复
$_ 是默认参数的意思,指的是在不指定的情况下,程序处理的上一个变量, 所以如果执行$lines = <IN>后,$_的值就是$lines
kingwmj78 2010-09-24
  • 打赏
  • 举报
回复
谢谢楼上的,问题按你说的解决了。
再问一下,为什么while (<IN>)已经读了一行到$_里,你下面再$lines = <IN>相当于把刚刚读出来的直接丢掉然后处理下一行?我只想把 <IN>暂存在$lines里面。
iambic 2010-09-24
  • 打赏
  • 举报
回复
一、把自己的Perl代码格式弄干净点。缩进空格花括号什么的都乱七八糟的。不养成清洁的习惯,是写不好代码的。
二、没有加use strict;
三、$lines应该是$line。
四、/.*Polymorphism.*/写成/Polymorphism/就可以了。
五、select OUT;是想干啥?
六、while (<IN>)已经读了一行到$_里,你下面再$lines = <IN>相当于把刚刚读出来的直接丢掉然后处理下一行了。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧