免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yilongyansha
打印 上一主题 下一主题

perl循环多行匹配问题请教 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
21 [报告]
发表于 2015-07-07 13:51 |只看该作者
回复 19# xiaoxingan99

我是对比了源文件才发现有重复的


   

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
22 [报告]
发表于 2015-07-07 14:01 |只看该作者
回复 21# yilongyansha


    @b=<MYFILE1>;
foreach $b (@b){
    if($b =~ /75(\d{6})75910633343435/){

        $a = $1;
print "$a \n"; #这边加一句,看看你$a匹配出来的到底是不是有两行重复的,如果$a就有重复的,结果肯定重复
        foreach $c (@b){
                if($c =~ /75($a)75/){
             print "$c\n";
                }
}
}
}
另外,我说的源文件是你说的3w多行的那个,你搜一下,是否有重复的行,如果有重复的行,肯定要匹配出来的,如果你是说你不想要重复的匹配结果,用hash删除重复的就可以了
hash我不是很懂,你可以看一下,以前好多问题都是用hash删除相同的行

最后,你可以把你的源文件减少到十几行,方便你检查问题原因。

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
23 [报告]
发表于 2015-07-07 14:05 |只看该作者
回复 15# yilongyansha


是不是
  1. #!/usr/bin/perl

  2. my $MATCH = qr/^\S+\s+\S+\s+\S+75(\d{6})75910633343435/;
  3. my @SIX_DIGITS;
  4. my @REDO;

  5. while (<DATA>) {
  6.     next if '.' eq substr $_, 0, 1;
  7.     next if index( $_, 75 ) < 0;
  8.     if (/$MATCH/) {
  9.         push @SIX_DIGITS, $1;
  10.         print;
  11.     }
  12.     else {
  13.         push @REDO, $_;
  14.     }
  15. }

  16. for my $LINE (@REDO) {
  17.     for my $SIX_DIGITS (@SIX_DIGITS) {
  18.         if ( $LINE =~ /^\S+\s+\S+\s+\S+75${SIX_DIGITS}75/ ) {
  19.             print $LINE;
  20.             last;
  21.         }
  22.     }
  23. }

  24. __DATA__
  25. 2015-7-6 15:30:06  BS7546152075910633343435A
  26. 2015-7-6 15:30:08  CAB753715207511043333333326
  27. .......................
  28. 2015-7-6 15:30:16  CAB754615207511043333333321
  29. .......................
  30. 2015-7-6 15:31:20  BS7538152075910633343435B
  31. .......................
  32. 2015-7-6 15:31:31  CS7538152075110433333333B8
  33. .......................
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
24 [报告]
发表于 2015-07-07 14:14 |只看该作者
本帖最后由 yilongyansha 于 2015-07-07 14:14 编辑

回复 23# substr函数

我的问题,我没说清楚
中间一连串的........是代表有很多类似的行,不是"."字符,我的文件中没有特殊符号,只有空格和换行符


   

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
25 [报告]
发表于 2015-07-07 14:17 |只看该作者
回复 24# yilongyansha


delete

    next if '.' eq substr $_, 0, 1;

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
26 [报告]
发表于 2015-07-07 14:18 |只看该作者
回复 22# xiaoxingan99

好,我试一下

只要是符合条件的,不管重不重复都要输出,而且重复的也不用删除


   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
27 [报告]
发表于 2015-07-07 14:22 |只看该作者
回复 22# xiaoxingan99

另外,怎样把输出的结果存放在另一个.txt文件中呢,方便我查看结果


   

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
28 [报告]
发表于 2015-07-07 14:59 |只看该作者
回复 27# yilongyansha


    1. 可以直接用命令行
    perl e:\test2.pl >>c:\log.txt
    2. 用perl的文件句柄
open A, ">>c:/log.txt";

print A $a; #$a是你想要输出的东西

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
29 [报告]
发表于 2015-07-07 14:59 |只看该作者
回复 22# xiaoxingan99

谢谢。结果存放在文件中这个功能实现了,前面的我再试一下


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
30 [报告]
发表于 2015-07-09 00:02 |只看该作者
本帖最后由 MMMIX 于 2015-07-09 00:03 编辑

回复 1# yilongyansha


    假设所有模式是顺序出现的,找到需要的模式就循环直到下一个新模式出现:

  1. OUTER:
  2. while (<>) {
  3.         if (m/75(\d{6})75910633343435/) {
  4.                 print;
  5.                 $last_pat = $1;
  6.                 while (<>) {
  7.                         m/$last_pat/ ? print : redo OUTER;
  8.                 }
  9.                 last OUTER;
  10.         } elsif (defined $last_pat and m/$last_pat/) {
  11.                 print;
  12.         }
  13. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP