Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 简单Perl正则表达式解析器_Regex_Perl_Parsing - Fatal编程技术网

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
未定义,您将收到一系列警告和虚假结果。使用一些错误逻辑代码轻松修复。完成!感谢您指出。