2009-09-09 32 views
0

我有這樣的條件在一個perl腳本:Perl正則表達式問題

if ($lnFea =~ m/^(\d+) qid\:([^\s]+).*?\#docid = ([^\s]+) inc = ([^\s]+) prob = ([^\s]+)$/) 

和$ lnFea表示這種線的:

0 QID:7968 1:0.000000 2:0.000000 3:0.000000 4:0.000000 5:0.000000 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.000000 12:0.000000 13:0.000000 14:0.000000 15:0.000000 16:0.005175 17:0.000000 18:0.181818 19:0.000000 20: 0.003106 21:0.000000 22:0.000000 23:0.000000 24:0.000000 25:0.000000 26:0.000000 27:0.000000 28:0.000000 29:0.000000 30:0.000000 31:0.000000 32:0.000000 33:0.000000 34:0.000000 35:0.000000 36:0.000000 37 :0.000000 38:0.000000 39:0.000000 40:0.000000 41:0.000000 42:0.000000 43:0.055556 44:0.000000 45:0.000000 46:0.000000 #docid = GX000-00-0000000 inc = 1 prob = 0.0214125

問題是,if爲true在Windows上,但在Linux上是錯誤的(Fedora 11)。兩個系統都使用最新的perl版本。那麼這個問題的原因是什麼?

回答

10

假設$InFea是從一個文件讀取的,我打賭這個文件是DOS格式的。這會導致$定位點阻止在Linux上進行匹配,因爲這些平臺之間的線路結尾存在差異。 Perl的automagic換行轉換僅適用於平臺原生文本文件。如果輸入文件是DOS格式,那麼Linux機器會在行尾之前看到額外的回車符。

最好將輸入文件轉換爲每個平臺的本機格式。如果這是不可能的,你應該在文件句柄(阻止Perl執行換行轉換)之前binmode,並且在regex和其他任何地方使用數據來解釋各種換行符序列。

+0

+1我同意。 OP應該轉換行結束格式或在正則表達式中包含可選的CRLF序列。 – 2009-09-09 18:04:40

+0

+1我打算說同樣的話。如果您在正則表達式結尾處刪除$,則可能會出現這種情況。 – 2009-09-09 18:07:18

+0

或者:s/\ r // g和chomp()刪除任何EOL字符並接受任意混合行結束符。 但馬克可能是正確的,$ $沒有增加正則表達式的價值,可以被消除。接受超集語法通常不是一個錯誤,並且正則表達式會導致糟糕的有效性解析器。 最後:無需在該正則表達式中轉義您的':'和'#'字符。 – 2009-09-09 18:16:14