2013-02-05 28 views
5

Nispeten yeni bir perl var ve nasıl çalıştığını anlamadığım bir sözdizimi parçasının olduğu check_ilo2_health.pl kod örneğinin bir örneği var. Kod pasajı SSL istemci verilerini ayrıştırmakta, bu durumda XML satır satırındadır.Perl, Regex eşleştirmesinden atama için atama

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

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

söz konusu XML örneği:

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

Yani bu durumda eğer deyim XML örneğinin MESAJI hattını alır. my ($ msg) değişkeninin bir çeşit liste olarak değerlendirildiğini ve normal ifadelerin nasıl eşleştiğini anlıyorum; ancak, anlamadığım şey, $ msg için numaralı bir hata olması gibi bir sözdizimidir. Perl, parantez sözdizimi ile oynamak ve bunun çalışması için böyle görünüyor. Çalışırken nasıl çalıştığını bilmek isterim. Herhangi bir yardım takdir edilecektir.

+0

Eğer '= ~' ya da '! ~' Ya atıfta bulunuyorsanız, bunlar [ciltleme operatörleridir] (http://perldoc.perl.org/perlop.html#Binding-Operators). –

cevap

10

Perlretut, Extracting-matches bakınız:

... skaler bağlamda, $time =~ /(\d\d):(\d\d):(\d\d)/ bir doğru veya yanlış değerini döndürür. Liste bağlamda, ancak

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

($line =~ m/MESSAGE='(.*)'/) yılında, eşleşen değerlere Yani

($1,$2,$3) listesini döndürür yakalama gruplar tarafından eşleşmelerin listesini döndürür. Bir yakalama grubunuz var, bu yüzden içeriği daha sonra ($ msg) kaydedilir.

+0

Mükemmel, teşekkürler! Bu mantıklı. Kaynağınıza bir bağlantı sağladığınızdan, ancak yine de 15'ten az itibara sahip olduğum için cevabınızı kabul ediyorum. Oh iyi. +1 – Burns