Regex 简单Perl正则表达式解析器
嘿,我正在做一个非常基本的解析器。我几乎可以肯定我的正则表达式是正确的,但值似乎没有存储在我的Regex 简单Perl正则表达式解析器,regex,perl,parsing,Regex,Perl,Parsing,嘿,我正在做一个非常基本的解析器。我几乎可以肯定我的正则表达式是正确的,但值似乎没有存储在我的$1和$2中。我做错什么了吗?我只是在寻找修改代码的技巧。谢谢你的建议!另外,我是Perl新手,因此,如果我做错了什么,我希望能从正确的角度出发,养成良好的习惯 文件中的示例行: Sat 02-August-2008 20:47 - 123.112.3.209 - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; 我刚从《泰晤士报》得到时
$1
和$2
中。我做错什么了吗?我只是在寻找修改代码的技巧。谢谢你的建议!另外,我是Perl新手,因此,如果我做错了什么,我希望能从正确的角度出发,养成良好的习惯
文件中的示例行:
Sat 02-August-2008 20:47 - 123.112.3.209 - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;
我刚从《泰晤士报》得到时间
foreach my $line (@lines)
{
my $match =~ /\d\d-\w+-\d{4} (\d)(\d):\d\d/;
if( $1 == 0)
{
$times[$2] = $times[$2] + 1;
}
else
{
my $time = $1.$2;
$times[$time] = $times[$time]+ 1;
}
}
print "\n";
for(my $i=0;$i<24;$i++)
{
print "$i: $times[$i]\n";
}
foreach my$行(@lines)
{
我的$match=~/\d\d-\w+-\d{4}(\d)(\d):\d\d/;
如果($1==0)
{
$times[$2]=$times[$2]+1;
}
其他的
{
我的$time=$1.$2;
$times[$time]=$times[$time]+1;
}
}
打印“\n”;
对于(my$i=0;$i如果要在$line
上匹配,代码是否应该读取
$line =~ /\d\d-\w+-\d{4} (\d)(\d):\d\d/;
.您能举例说明您尝试匹配哪种模式吗?否则我无法判断您的正则表达式是否匹配您的模式。不过,您可以对代码进行一些改进:
首先,如果要使用$1、$2等,请始终测试匹配是否成功
if($match =~ /\d\d-\w+-\d{4} (\d)(\d):\d\d/) {
if( $1 == 0)
{
$times[$2] = $times[$2] + 1;
}
else
{
my $time = $1.$2;
$times[$time] = $times[$time]+ 1;
}
} else {
warn "no match!\n";
}
第二,始终使用“-w”开关。在这种情况下,您可能会收到有关$1和$2由于匹配失败而未初始化的警告消息:
#!/usr/bin/perl -w
首先,如果您是Perl新手,其中一个优势就是CPAN和那里的许多解决方案
有一个很好的模块,名为,它将为您解析时间部分。那么,您唯一的正则表达式问题就是将行的时间部分分离出来
基于您的单行示例,此代码将执行以下操作:
use strict;
use warnings;
use Date::Parse;
my $line="Sat 02-August-2008 20:47 - 123.112.3.209 - \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;";
my $tmpart;
if ($line=~ /^(.*\d+:\d+) -/) {
$tmpart=$1;
print "Time part = $tmpart\n";
my $time=str2time($tmpart);
my ($ss,$mm,$hh,$day,$month,$year,$zone) = strptime($tmpart);
$year+=1900;
$month+=1;
print "Unix time: $time\n";
print "Parsed time: $month/$day/$year $hh:$mm:$ss \n\n";
}
else {
warn "no match!\n";
}
这将返回易于使用的Unix时间编号。或(如图所示)你可以解析时间的各个组成部分。你想解析什么?你知道,我们在这里不是通灵者。@jesperE使用示例编辑。我知道我正在从文件中获取行。我之前测试过,并且能够在循环中重新打印每行。嗯,我做了更改,但仍然不起作用。我的$1和$2似乎是空的y、 我很欣赏这个技巧,我想你可能是对的,必须是$line,但由于我是Perl的初学者,我不确定我从示例行中得到了2和0,正如预期的那样。你确实在$line
前面去掉了我的,对吗?哈哈,感谢你看穿了我的新特性。我很感谢你接受这个技巧谢谢你的帮助。祝你度过一个愉快的夜晚。谢谢你的提示。我真的很感激。另一个人的回答解决了我的问题,所以没有必要对我的问题进行更详细的研究。但是,我会将你的提示融入我的代码中。祝你晚上愉快这句话会产生一些问题:my$tmpart=$1 if$line=~/^(.\d+:\d+)-/;
如果您的正则表达式无法匹配,$tmpart
未定义,您将收到一系列警告和虚假结果。使用一些错误逻辑代码轻松修复。完成!感谢您指出。