2012-09-19 2 views
-2

У меня есть скаляр, значение которого будет таким.соответствие шаблону в одной строке в perl

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# 

Я хочу взять TIMEFIELD (12:14:38) и ф (152.14.189.99) от этого в Perl. Я попытался использовать это.

$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

Какую ошибку вы получаете? Вы уверены, что это ошибка компиляции, а не ошибка времени выполнения? – epsalon

+0

Глобальный символ «$ p» требует явного имени пакета в ./patternmatching.pl строке 8. Выполнение ./patternmatching.pl отменено из-за ошибок компиляции. – Raj

+0

Каков полный текст вашего скрипта? Вы ищете регулярное выражение в переменной '$ p', которая никогда не определяется. – epsalon

ответ

0

Помимо ошибки компиляции, которую невозможно понять без больше контекста, вот что вы могли бы сделать, учитывая, что ваш скаляр называется $p:

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

EDIT: Это работает ваш новый формат строки:

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

Не так ли? 14.189.6'? Кроме того, точка не должна быть экранирована в символьном классе, то есть '\ .' eq' [.] ' – amon

+0

1 #!/Usr/bin/perl -w 2 $ p =" Sun Sep 9 12:14 : 56 2012: [Pro] Запись в файл (/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# "; 3 ($ time, $ ip) = $ p = ~/(\ d + [\.] \ D + [\.] \ D + (?: \. \ D +)?)/G; 4 print $ time $ ip; Все еще я получаю сообщение об ошибке() на неоткрытой дескрипторе файла 12:14:56 на ./patternmatching.pl строке 4. – Raj

+0

@amon: Да, это было бы. Я тестировал его с исходными данными 'Sun Sep 9 12:14:38 2012: [Rep] Ответить обратно к 152.14.189.99/msg: # he # llo_reply_disc mac = 00: 02: 55: 70: 00: 00 #/repeat : 1'. – flesk

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 
Смежные вопросы