我有一个标量,其值将是这样的。
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;
答案 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+)/;