2009-09-05 30 views
3

我有perl正則表達式匹配網絡腳本的問題,我已經設法將行爲放在一個小的片段中。爲什麼我的正則表達式匹配版本號不起作用?

取本Perl的片斷爲Perl 5.10.0 Debian中:

#!/usr/bin/perl 
use warnings; 
use strict; 

my $line = "Version: 0\r\n"; 
my($version) = $line =~ m/^Version:(\s\d+)\r\n$/; 
print "1st failed \n" if not $version; 
($version) = $line =~ m/^Version:\s(\d+)\r\n$/; 
print "2nd failed \n" if not $version; 
($version) = $line =~ m/^Version:\ (\d+)\r\n$/; 
print "3th failed \n" if not $version; 

有了這個輸出:

2nd failed 
3th failed 

顯然第一和第二之間的唯一差別是移動的空間出來的提取的模式,它理論上根本不應修改正則表達式,只是返回的部分。

我不明白爲什麼第二和第三不會像第一個那樣工作。

編輯: 如果您刪除$版本中的圓括號不是相同的腳本,您沒有得到匹配的結果,您得到操作的布爾結果,以獲得匹配的結果,你需要接收它一元(只有一個匹配的字符串)元組。

回答

12

問題是你正在測試布爾值爲true,因爲在後兩種情況下,你提取的字符串值爲false(字符串'0')。試試這個:

$line = "Version: 0\r\n"; 
my $version; 
($version) = $line =~ m/^Version:(\s\d+)\r\n$/; 
print "1st failed \n" unless defined $version; 
($version) = $line =~ m/^Version:\s(\d+)\r\n$/; 
print "2nd failed \n" unless defined $version; 
($version) = $line =~ m/^Version:\ (\d+)\r\n$/; 
print "3th failed \n" unless defined $version; 
+0

你肯定是對的,這不會發生在「版本:1」,匹配的模式是字符串「0」,其布爾結果爲假。我以前怎麼沒注意到? :| – 2009-09-05 11:27:05

+1

你可能沒有注意到,因爲第一場比賽還有'0'。不同的是,第一個匹配捕獲了[] 0',並且空白空間的存在導致*那個*字符串被評估爲真。這就是爲什麼我至少沒有馬上看到它的原因。 – Telemachus 2009-09-05 13:27:07

+0

「'print」failed \ n「除非($ version)= $ line =〜〜''」也可能工作 – 2009-09-08 02:01:57

2

你沒有測試匹配運算符。如果你想看看如果地址不匹配,測試賽:

if($line =~ m/(...)/) { 
    $version = $1; 
    } 

你至少可以確認在調試縮小問題發生故障的部分。

不同的數據工作,如:

Version: 1\r\n 

會顯示你不同的行爲,你可能已經注意到,如果只是失敗時的版本爲0,即有可能點燃你的腦袋有些燈泡: )

相關問題