perl中单行中的模式匹配

时间:2012-09-19 05:34:43

标签: perl pattern-matching

我有一个标量,其值将是这样的。

Sun Sep  9 12:14:56 2012 : [Pro] Write to file(/root/mesh/MeshBed/trunk/meshproc/neighInfo/neighbors-list_152.    14.189.6) : #ip=152.14.189.99 neighinfo=NULL mac=06:02:6F:A7:3E:BC#

我想在perl中使用Timefield(12:14:38)和ip(152.14.189.99)。我试过用这个..

$p =~ /ip\=(\.\d+\.\d+\.\d+\d+)/;
print $1;

这会引发编译错误。任何人都可以解决这个问题。

#!/usr/bin/perl -w

use strict;
use warnings;

my $p = "Sun Sep  9 12:14:56 2012 : [Pro] Write to file(/root/mesh/MeshBed/trunk/meshproc/neighInfo/neighbors-list_152.    14.189.6) : #ip=152.14.189.99 neighinfo=NULL mac=06:02:6F:A7:3E:BC#";

$p =~ /ip\=(\.\d+\.\d+\.\d+\d+)/;

print $1;

2 个答案:

答案 0 :(得分:4)

运行时,会产生我期望的答案:

#!/usr/bin/perl -w

use strict;
use warnings;

my $p = "Sun Sep  9 12:14:56 2012 : [Pro] Write to file(/root/mesh/MeshBed/trunk/meshproc/neighInfo/neighbors-list_152.    14.189.6) : #ip=152.14.189.99 neighinfo=NULL mac=06:02:6F:A7:3E:BC#";


print "Time: $1; IP: $2\n"
    if ($p =~ /(\d+:\d+:\d+) .*ip=(\d+\.\d+\.\d+\.\d+)/);

IP地址的正则表达式不再需要前导点,并且期望第三个和第四个数字之间有一个点。当时的正则表达式也很简单。

输出结果为:

Time: 12:14:56; IP: 152.14.189.99

答案 1 :(得分:0)

除了在没有更多上下文的情况下无法弄清楚的编译错误,这里是你可以做的,因为你的标量被称为$p

my ($time, $ip) = $p =~ / (\d+[.:]\d+[.:]\d+(?:\.\d+)?)/g;

编辑:这适用于您的新字符串格式:

my ($time, $ip) = $p =~ /(\d+:\d+:\d+).+ip=((?:\d+\.){3}\d+)/;