欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

神奇的Perl-正则表达式(3)

程序员文章站 2022-05-09 15:57:22
...

声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载
2.1         特殊字符匹配
在Perl 正则中,某些字符具有特殊含义,譬如“?”、“*”、“.”、“+”等。如果模式串需要把这些符号当作纯文本来处理的话,就必须在它前面加上反斜杠(\)。

比如:

#perl4-2.pl

my $name="你叫什么名字?";

my $filename="plane.jpg";

if  ($name=~m/\?/){

    print "$name是疑问句\n";#匹配疑问句

}

if  ($filename=~m/\.jpg$/){

    print "$filename为JPG类型图像文件\n";#文件扩展名为jpg

}

 

输出结果如下:

你叫什么名字?是疑问句

plane.jpg为JPG类型图像文件

2.2         第五个任务公司新开发的小型ERP系统试运行时,经常出故障,小黄奉命查出故障来源,系统记录用户操作保存在run.log的日志文件中。

run.log的结构大致如下,每列信息以#相隔。
2010-07-01#09:12:10#zhangsang login success
2010-07-01#09:15:30#zhangsang save success
2010-07-01#09:16:50#lisi login error#系统错误#用户不存在
2010-07-01#09:18:05#zhangsang exit success
2010-07-01#13:19:10#wangwu login error#系统错误#密码错误
2010-07-02#09:20:10#lisi login success
2010-07-02#09:31:32#lisi save error#SQL执行失败#insert error
2010-07-02#09:28:32#lisi exit success


由于日志文件过于巨大,小黄无法人工查找错误,只能用perl编写以下脚本筛选错误,并将错误输出到单独的文本文件runerr.txt中。

#perl4-3.pl
use strict;
use warnings;
 
open LOG,"<run.log";
open ERRLOG,">runerr.txt";
foreach my $line(<LOG>){
   if ($line=~m/error/i) {#只匹配日志中的错误事件,错误事件都包括“error”字符
       chomp($line);#去除换行符
       (my $mydate,my $mytime,my $mysj,my $myerr,my $errinfo)=split("#",$line);#获取事件信息
       print ERRLOG "--------\n";
       print ERRLOG "日期:$mydate\n时间:$mytime\n事件:$mysj\n错误类型:$myerr\n错误信息:$errinfo\n";#输出错误信息到runerr.txt中
   }
}
close LOG;
close ERRLOG;

 脚本执行完毕后,打开runerr.txt,错误信息如下,一目了解:
--------
日期:2010-07-01
时间:09:16:50
事件:lisi login error
错误类型:系统错误
错误信息:用户不存在
--------
日期:2010-07-01
时间:13:19:10
事件:wangwu login error
错误类型:系统错误
错误信息:密码错误
--------
日期:2010-07-02
时间:09:31:32
事件:lisi save error
错误类型:SQL执行失败
错误信息:insert error