免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Perl 除法题
12345下一页
最近访问板块 发新帖
查看: 19667 | 回复: 44
打印 上一主题 下一主题

除法题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-25 12:41 |只看该作者 |正序浏览
大家好:
     我有一个文件,里面标题(NTSEQ)和字母组成,字母有几行为一段的,也有十几行为一段的,我想做的工作就是把 为一段的字母能被3整除,能被整除的就print出来,不能被3整除的就抛弃。
    我是这样做的,但还是做错了
    #!/usr/bin/perl-w
use strict;
open (IN,'d:\perl\genes\') || die "$!";
open (OUT,'>d:\perl\genes_fasta\.fasta') || die "$!";
my ($title,$seqs);
while (<IN>) {
        if (/^NTSEQ/) {
           $title = $_;
           }
        else {
           $seqs .= $_;
           if ($seqs%3==0) {   #肯定是这一步错了,好像它什么也不做。
             print OUT;
             }
           }
    }
          该怎么做?谢谢大家

论坛徽章:
0
45 [报告]
发表于 2009-09-29 16:41 |只看该作者

回复 #44 dugu072 的帖子

O(∩_∩)O哈哈~

论坛徽章:
0
44 [报告]
发表于 2009-09-29 16:30 |只看该作者
我已经年假中了~~
另外,toniz,你要感谢我一件事儿,我陪你,从 侠客 变为 骑士 了……

论坛徽章:
0
43 [报告]
发表于 2009-09-29 16:24 |只看该作者

回复 #42 dugu072 的帖子

呵呵  我很早很早的时候就说是换行问题了。是吧!
虽然浪费这么多口水  但是没关系  
哈哈 反正现在无聊得很 盼着国庆回家  都没什么心情做事呢。O(∩_∩)O

论坛徽章:
0
42 [报告]
发表于 2009-09-29 16:10 |只看该作者
问题知道了,当然就知道如何改了。

我一直分析的,就是你给的那段 正则 ,不是说你写错了,而是遇到问题了,分析出原因而已!我不是想针对你的代码,批评什么,解决我遇到的问题,才是最终目的。

而且,我一开始的态度就是,你的代码虽然精简,但是调试很麻烦,比如一开始,完全没有注意到,你会将换行统计到 length 中去,这个做法,分析数据规律的说法,很难说通,因为这不符合逻辑,哪有统计字符串长度,还要去加换行符的呢?——当然,我知道你说了,有解决方法,但我强调的只是,代码,让自己容易理解一些,容易调试一些,仅此而已。

好了,不说了,toniz,和你讨论收获颇多,而且问题也最终解决,至此结束吧,谢谢!

论坛徽章:
0
41 [报告]
发表于 2009-09-29 15:46 |只看该作者
原帖由 toniz 于 2009-9-29 10:24 发表
这个是换行符的问题。不同系统的换行符号是不一样的。
如果你想把换行符的因素考虑进去,那么可以用下面的正则去匹配:
my %rf= ($file_contend  =~ /(NTSEQ.*?)(?:\r\n|\r|\n)([\d\D]*?)(?=NTSEQ)/g);



还有这里不是说了,如果非要考虑换行因素,建议用这个正则啊。这个就是匹配一个换行符,不管你是\r ,\n或者是\r\n。当然,如果你要对数据加多一个换行,那么你就需要再处理一下了。O(∩_∩)O

[ 本帖最后由 toniz 于 2009-9-29 16:00 编辑 ]

论坛徽章:
0
40 [报告]
发表于 2009-09-29 15:38 |只看该作者

回复 #38 dugu072 的帖子

而且像你这样说的这样有N个换行之类的话,或者是你还想字母中间还会出现空格这类的话,
那么最好是在EACH循环里对$VALUE值在处理一下了。不然正则会看起来很繁琐。

论坛徽章:
0
39 [报告]
发表于 2009-09-29 15:30 |只看该作者

回复 #38 dugu072 的帖子

真晕呢
说来说去,是你自己加个换行,然后说出了问题。
写正则就要先看数据的规律,你加了个换行,数据的规律就不一样了。
你非要加个换行,那就把(?:\r\n|\r|\n)后面加个+号或者是{1,X}.
具体看你的数据是怎么增加的。

论坛徽章:
0
38 [报告]
发表于 2009-09-29 15:04 |只看该作者
原帖由 toniz 于 2009-9-29 13:51 发表



那就真不知道你想表达什么了。
把你的测试数据贴出来吧。毕竟像这种精确匹配的正则表达式还是要看具体数据的。


不用发数据了,我把你的代码的数据的hex值都打出来跟了一遍,发现了确实存在一些问题,也是为什么我跑不过的原因:
逻辑问题:
    my %rf= ($file_contend  =~ /(NTSEQ.*?\r\n)([\d\D]*?)(?=NTSEQ)/g);
    这里由于是全局匹配所有字符,且包括换行,因此对于 data 的 length 计算,你会将 换行符 统计进去,因此,我在数据后加上一个回车后,自然导致length增加,而无法显示
语法问题:
    上述你认为的 windows 中的换行符 \r\n ,是不应该如此使用的,因为Windows下 Perl 缺省打开的文件句柄是 text mode,对于 <> 等读操作,会自动将 '\r\n' 转换为 '\n' ,因此,在你的代码中,将永远看不到 \r\n 的数据,除非 binmode( FH ) 一下,当然更简单的,Perl 就是想让换行符平台无关,直接 '\n' 替代即可

所以,如果诸如如下数据:
NTSEQ       339
            a #注意只有一个 数据 'a'
NTSEQ       276
反而是可以匹配的,因为后面如果加上 '\r\n' 就刚好是 3个字符(前提是你用了 binmode)。

论坛徽章:
0
37 [报告]
发表于 2009-09-29 13:51 |只看该作者
原帖由 dugu072 于 2009-9-29 12:28 发表


不知道你是如何看出我只是接触了windows的……

我已经清楚说过了 [\d\D]是无关换行符的,不知道你为什么没有看见. 至于说语法问题,我想,我还是看得明白的,还不至于在这里长篇讨论基本的语法问题!
只 ...



那就真不知道你想表达什么了。
把你的测试数据贴出来吧。毕竟像这种精确匹配的正则表达式还是要看具体数据的。
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP