新手问题,为啥我用while循环感觉只读了第一行之后就结束啦?

weininglzu 发布于 2015/11/19 08:51
阅读 593
收藏 0
我想把文件A分割成四个文件
A的内容为
>chr1
NNNNNNNNNNNNNNNNNNNNAAAAAAAAAAAAAAAA
>chr2
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
>chr3
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
>chr5
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

想分割为chr1, chr2, chr3, chr5四个文件,内容分别是每个标题下的内容,
例如chr1的内容就是:
>chr1
NNNNNNNNNNNNNNNNNNNNAAAAAAAAAAAAAAAA

我的程序是这样写的
#!/usr/bin/perl
use strict;
use warnings;
open FR, "A"||die("could not open file");
while(<FR>){                               #y=行内容
       chomp;                              #去除换行符
       if(/\>/){                           #如果当前行内有>
           open FW, ">$_.fa"||die;         #则新建一个以>后内容为名称的文件
           print FW;                       #并把当前行内容写入。
            }
       eles{                               #如果不存在>
            print FW ;                     #把当前行内容写进文件
            close FW; }                    #关闭文件
}
close FR;

为啥最后只产生一个文件,只有chr1.fa,

并且内容只有: >chr1>chr1>chr1 求解,哪里出了问题啊?为啥不是按我想象的走下去了呢? 为啥感觉while循环只读了第一行之后就停止了呢?
加载中
0
黄冠能
黄冠能

语法错误:eles

可能重用FW file handler时出了问题,die了

无法解释为什么是3个>chr1

w
weininglzu
else写错了, 昨天晚上写的,居然我的编辑器没有提示-_-!!!
0
inuxor
inuxor
根本不是什么新手不新手的问题,是你else写错了
w
weininglzu
确实是else写错了, 昨天晚上的写的,刚让别人瞅了一眼,结果就发现。。。 现在问题已经完全解决啦。。。
0
哎呦笨小孩
哎呦笨小孩
>chr1

NNNNNNNNNNNNNNNNNNNNAAAAAAAAAAAAAAAA

按我的想法判断。

第一次if以后 创建了chr1文件并将当前所得字符串其写入该文件

第二次if以后 进入了else 由于本行为空 所以向当前文件写入空字符以后 直接关闭了文件。

第三次if以后 拿到了文本内容NNNNNNNNNNNNNNNNNNNNAAAAAAAAAAAAAAAA 但是你已经关闭了文件,导致写入失败,却又没有一个 处理失败的逻辑

所以第三次当你的程序进入else后 执行到fw print 程序就出问题了。

w
weininglzu
else写错了。。。 接下来稍微修改就达到解决问题的效果啦。
0
w
weininglzu

问题已经解决,谢谢上面三位热心高手!

昨天晚上写的时候有点困,else写错了,并且该死的编辑器也没有提示错误,我还以为while循环出问题了呢。。。

最终解决问题的程序如下

#!/usr/bin/perl
use strict;
use warnings;
open FR, "A"||die("could not open file");
while(<FR>){                               #$_等于行内容是否为真
       chomp;                              #去除换行符
       if(/\>/){                           #如果当前行内有>
           open FW, ">$_.fa"||die;         #则新建一个以>后内容为名称的文件
           print FW "$_\n";                #并把当前行内容写入。
            }
       else{                               #如果不存在>
            print FW "$_\n";               #把当前行内容写进文件
             }
}
close FR;                                  #关闭文件
close FW;                                  #关闭文件



OSCHINA
登录后可查看更多优质内容
返回顶部
顶部