-2

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

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;
4

2 回答 2

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
于 2012-09-19T05:52:20.777 回答
0

除了在没有更多上下文的情况下无法弄清楚的编译错误之外,鉴于您的标量被调用,这是您可以做的事情$p

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

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

my ($time, $ip) = $p =~ /(\d+:\d+:\d+).+ip=((?:\d+\.){3}\d+)/;
于 2012-09-19T05:43:29.270 回答