我有這樣的條件在一個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版本。那麼這個問題的原因是什麼?
+1我同意。 OP應該轉換行結束格式或在正則表達式中包含可選的CRLF序列。 – 2009-09-09 18:04:40
+1我打算說同樣的話。如果您在正則表達式結尾處刪除$,則可能會出現這種情況。 – 2009-09-09 18:07:18
或者:s/\ r // g和chomp()刪除任何EOL字符並接受任意混合行結束符。 但馬克可能是正確的,$ $沒有增加正則表達式的價值,可以被消除。接受超集語法通常不是一個錯誤,並且正則表達式會導致糟糕的有效性解析器。 最後:無需在該正則表達式中轉義您的':'和'#'字符。 – 2009-09-09 18:16:14