-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 アドレスの正規表現では、先頭のドットが不要になり、3 番目と 4 番目の数字の間にドットが必要になります。時間の正規表現も非常に簡単です。

出力は次のとおりです。

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 に答える