我正在逐行解析日志文件,并检查该行是否定义了正确的模式,如果它遵循我正在处理该行的模式。示例:内部Perl脚本
my $reg= qr/^(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2})\:\d{2}\sID:(.*?)\|RID:(.*?)\|M:(.*?)\|S:(.*?)\|AI:(.*?)\|AC:(.*?)\|OH:(.*?)\|CLID:(.*?)\|FM:(.*?)\|TO:(.*?)\|EP:(.*?)\|CQ:(.*?)\|MN:(.*?)\|IN:(.*?)$/;然后我就这么做了
if($line =~ $reg){
$YEAR = $1; $MONTH = $2; $DAY = $3; $HOUR = $4; $MIN =$5; $S = $9; $ID = $10; $EP = $16;
//Further logic
}文件内容为:
2021-02-16 11:05:14 ID:|RID:|M:|S:200|AI:10|AC:|OH:139644905692592|CLID:642208aa-cc6f-1239-8db7-fa163e46bd1e|FM:|TO:|EP:600000|CQ:|MN:|IN:
2021-02-16 11:05:14 ID:|RID:|M:|S:200|AI:10|AC:|OH:139644905692592|CLID:642208aa-cc6f-1239-8db7-fa163e46bd1e|FM:|TO:|EP:600000|CQ:|MN:|IN:因此,一切都运行得很好。
但当我更改了示例输入文件,即在以后的时间添加了一个数字,2021-02-16 11:05:14,450 ID:,模式不匹配,我不知道如何添加模式,
更新的输入日志文件包含:
2021-02-16 11:05:14,450 ID:|RID:|M:|S:200|AI:10|AC:|OH:139644905692592|CLID:642208aa-cc6f-1239-8db7-fa163e46bd1e|FM:|TO:|EP:600000|CQ:|MN:|IN:在我的模式中添加什么来匹配11:05:14,450,
我在下面试过了,但不起作用:
my $reg= qr/^(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2})\:\d{2}\,(.*?)\sID:(.*?)\|RID:(.*?)\|M:(.*?)\|S:(.*?)\|AI:(.*?)\|AC:(.*?)\|OH:(.*?)\|CLID:(.*?)\|FM:(.*?)\|TO:(.*?)\|EP:(.*?)\|CQ:(.*?)\|MN:(.*?)\|IN:(.*?)$/;发布于 2021-03-01 16:27:43
将\,(.*?)更改为(,\d+)?。示例代码:
use strict;
use warnings;
my $line = "2021-02-16 11:05:14,450 ID:|RID:|M:|S:200|AI:10|AC:|OH:139644905692592|CLID:642208aa-cc6f-1239-8db7-fa163e46bd1e|FM:|TO:|EP:600000|CQ:|MN:|IN:";
my $reg= qr{^(?<year>\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2})\:\d{2}(,\d+)?\sID:(.*?)\|RID:(.*?)\|M:(.*?)\|S:(.*?)\|AI:(.*?)\|AC:(.*?)\|OH:(.*?)\|CLID:(.*?)\|FM:(.*?)\|TO:(.*?)\|EP:(.*?)\|CQ:(.*?)\|MN:(.*?)\|IN:(.*?)$};
if($line =~ $reg){
print "YEAR: ", $+{year}, "\n";
}请注意,我也使用了regexp named captures,我认为它们在这种情况下很有用(如果您的>=是Perl5.10)。
https://stackoverflow.com/questions/66417575
复制相似问题