2014-02-20 4 views
0

Я пытаюсь соответствовать следующим образом (ниже в массиве называется @abc):Perl регулярное выражение матч с номерами

goo foo tool: 1.2.1 (a3 change: 234342 @ 2014/02/19 14:20:27) 

с

my $match = "goo foo tool: (\d+)\.(\d+)\.(\d+) \(a3 change: \d+ @ #DATE# #TIME#\)"; 

и в моем коде,

78  foreach (@abc){ 
79   print "$_\n"; 
80   if ($_ =~ m/$match/){ 
81    print "$1\n"; 
82   } else { 
83    print "not matched\n"; 
84   } 
85  } 

Я не вижу, почему это печать «не соответствует \ n»;
Кто-нибудь еще видит, почему?

+2

Потому что # DATE # и # TIME # являются строковыми константами. – Miller

+0

Нет необходимости указывать '$ _', когда вы используете' m // 'или' s /// '. Они по умолчанию работают против '$ _'. Вот почему существует '$ _'. –

ответ

3

Строковые константы # DATE # и # TIME # не совпадают с датами, которые у вас есть. Просто приспособитесь к регулярному выражению, чтобы фактически соответствовать этим значениям:

my $match = "goo foo tool: (\d+)\.(\d+)\.(\d+) \(a3 change: \d+ \@ \d+/\d+/\d+ \d+:\d+:\d+\)"; 
+0

'@' в порядке, потому что за ним следуют пробелы. Если бы это было что-то еще, Perl попытался бы интерполировать массив этого имени в строку. Безопаснее избегать '@' в каждом случае: '\ @'. – Borodin

+0

@ Бородин Согласен, это хорошая практика, и я был одним из первых моих соображений, когда я рассматривал его вопрос. Я отредактировал ответ, чтобы это отразить. – Miller

Смежные вопросы