免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 6003 | 回复: 31
打印 上一主题 下一主题

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

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-06 16:10 |只看该作者 |倒序浏览
我有一个包含几万行的log1文件,部分内容如下:

.......................
2015-7-6 15:30:06  BS7546152075910633343435A
2015-7-6 15:30:08  CAB753715207511043333333326
.......................
2015-7-6 15:30:16  CAB754615207511043333333321
.......................
2015-7-6 15:31:20  BS7538152075910633343435B
.......................
2015-7-6 15:31:31  CS7538152075110433333333B8
.......................

这些内容之间还包括了很多行
如果要打印出包含字符串"75(\d{6})75910633343435"的行和包含$1的行并保存到log2文件中,如这部分内容我要得到的行是:
2015-7-6 15:30:06  BS7546152075910633343435A
2015-7-6 15:30:16  CB754615207511043333333321
2015-7-6 15:31:20  BS7538152075910633343435B
2015-7-6 15:31:31  CS7538152075110433333333B8

用perl脚本怎么实现呢?


我刚开始是想着一步一步来,先实现打印出$1,程序如下:
use strict;
open(MYFILE,"E:/log1.txt") or die("Can't open log1.txt");
$/ = undef;
while(my $values1 = <MYFILE>){
    if($values1 =~ /75(\d{6})75910633343435/){
        print $1;
    }     
}
close MYFILE;

但得到的只有一个值:461520,我本来想得到的结果是
461520
381520

因为还在初学阶段,我是想着一步一步来,先实现打印出$1,再实现包含$1的行,不过研究了很久第一步还没有实现。小妹是初学perl,请大家多多指教,谢谢!

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2015-07-07 05:47 |只看该作者
  1. $/ = undef;
复制代码
==>
  1. #  $/ = undef;
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
3 [报告]
发表于 2015-07-07 08:55 |只看该作者
请问应该如何实现打印出所有包含了$1(如包含461520和381520)的行?回复 2# rubyish


   

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

回复 2# rubyish

我写了一个程序,想实现打印所有包含$1的行,可是运行之后为空,什么都没有显示

use strict;
open(MYFILE,"E:/log1.txt") or die("Can't open log1.txt");
# local $/;
while(my $values1 = <MYFILE>){
    if($values1 =~ /75(\d{6})75910633343435/){
        if(my $values2 =~ /75($1)75/){
            print "$values2\n";
        }
    }     
}
close MYFILE;

   

论坛徽章:
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
5 [报告]
发表于 2015-07-07 09:28 |只看该作者
回复 3# yilongyansha


     if(($a)=$values1 =~ /75(\d{6})75910633343435/){
        print $a."\n";

好像是print $1有问题了,你换我上面这个方式,我试过了,可以的

论坛徽章:
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
6 [报告]
发表于 2015-07-07 09:30 |只看该作者
回复 4# yilongyansha


    你这个$value2根本没赋值啊,匹配不上,当然没有输出了

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

第一个问题解决了,谢谢!

第二个问题,$values2好像是没赋值,然后我改了一个程序:

use strict;
open(MYFILE,"E:/log1.txt") or die("Can't open log1.txt");
# local $/;
while(my $values1 = <MYFILE>){
    if($values1 =~ /75(\d{6})75910633343435/){
        while(my $values2 = <MYFILE>){
            if($values2 =~ /75($1)75/){
                print "$values2\n";
            }
        }
    }     
}
close MYFILE;

改程序之后结果也不对,只输出了
2015-7-6 15:30:16  CB754615207511043333333321

我想得到的输出是:
2015-7-6 15:30:06  BS7546152075910633343435A
2015-7-6 15:30:16  CB754615207511043333333321
2015-7-6 15:31:20  BS7538152075910633343435B
2015-7-6 15:31:31  CS7538152075110433333333B8
因为$1=381520也符合$values1的匹配

论坛徽章:
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
8 [报告]
发表于 2015-07-07 10:33 |只看该作者
回复 7# yilongyansha


    我没有试验哦,但是你尽量不要把$1用在后续的匹配里面,把它赋值出来
另外,第一次使用了<MYFILE>之后,再次使用<MYFILE>,应该是读出第二行,不是重新读一遍
如果你非要读两遍,再次赋值一个文件句柄MYFILE1

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

我把$1赋值给$a再匹配,也重新赋值了一个文件句柄MYFILE1,但后面符合匹配的还是没有输出,比如$1=381520的就没有显示,只输出了

2015-7-6 15:30:06  BS7546152075910633343435A
2015-7-6 15:30:16  CB754615207511043333333321

   

论坛徽章:
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
10 [报告]
发表于 2015-07-07 10:59 |只看该作者
回复 9# yilongyansha


    整个程序贴出来看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP