2013-02-05 3 views
5

Я относительно новичок в perl, и есть пример фрагмента кода в check_ilo2_health.pl, в котором есть фрагмент синтаксиса, который я не понимаю, как и почему он работает. Фрагмент кода обрабатывает данные клиента SSL, в данном случае XML, строчно.Perl, Назначить переменной из регулярного выражения

if ($line =~ m/MESSAGE='/) { 
    my ($msg) = ($line =~ m/MESSAGE='(.*)'/); #<---- HERE 

    if ($msg !~ m/No error/) { 
     if ($msg =~ m/Syntax error/) { #...etc 

Пример XML в вопросе:

<RESPONSE 
    STATUS="0x0000" 
    MESSAGE='No error' 
/> 

Таким образом, в этом случае, если оператор принимает MESSAGE линию образца XML. Я понимаю, что my ($ msg) рассматривает переменную как своего рода список, и я понимаю, как совпадают регулярные выражения; однако, я не понимаю, что синтаксис такой, что $ msg is присвоен до Ошибка. Кажется, что perl играет с синтаксисом в скобках, и для этого он работает. Пока он работает, я хотел бы знать, как это работает. Любая помощь будет оценена.

+0

Если вы имеете в виду '= ~' или '! ~', Это [связывающие операторы] (http://perldoc.perl.org/perlop.html#Binding-Operators). –

ответ

10

См Perlretut, Extracting-matches:

... в скалярном контексте, $time =~ /(\d\d):(\d\d):(\d\d)/ возвращает истинное или ложное значение. В контексте списка, однако, она возвращает список соответствующих значений ($1,$2,$3)

Так, в

($msg) = ($line =~ m/MESSAGE='(.*)'/); 

($line =~ m/MESSAGE='(.*)'/) возвращает список матчей по группам захвата. У вас есть одна группа захвата, поэтому содержимое этого файла сохраняется ($ msg).

+0

Отлично, спасибо! Это имеет смысл. Я бы поднял ваш ответ, так как вы предоставили ссылку на свой источник, но у меня все еще меньше 15 репутации. Ну что ж. +1 – Burns