2024 年 PHP Conference Japan

與 Perl 的差異

這裡描述的差異是針對 Perl 5.005。

  1. 預設情況下,空白字元是 C 函式庫 isspace() 所辨識的任何字元,儘管可以編譯具有替代字元類型表的 PCRE。通常 isspace() 會比對空格、換頁、換行、歸位字元、水平定位字元和垂直定位字元。Perl 5 不再將垂直定位字元包含在其空白字元集中。Perl 文件中長期存在的 \v 跳脫字元實際上從未被辨識。然而,至少在 5.002 版之前,該字元本身被視為空白。在 5.004 和 5.005 中,它與 \s 不符。
  2. PCRE 不允許在先行斷言 (lookahead assertion) 中使用重複量詞。Perl 允許,但它們的含義可能與您的預期不同。例如,(?!a){3} 並非斷言後三個字元都不是 "a"。它只是斷言後一個字元不是 "a",重複三次。
  3. 在否定先行斷言 (negative lookahead assertion) 中出現的捕獲子模式會被計數,但它們在偏移向量 (offsets vector) 中的項目永遠不會被設定。如果否定先行斷言只包含一個分支,Perl 會使用在斷言失敗(因此成功)之前匹配的任何此類模式來設定其數值變數。
  4. 雖然主字串中支援二進位零字元,但在模式字串中不允許使用,因為它是作為以零結尾的普通 C 字串傳遞的。可以使用跳脫序列 "\x00" 在模式中表示二進位零。
  5. 不支援下列 Perl 跳脫序列:\l、\u、\L、\U。事實上,這些是由 Perl 的一般字串處理實現的,並不是其模式匹配引擎的一部分。
  6. 不支援 Perl 的 \G 斷言,因為它與單一模式匹配無關。
  7. 顯然地,PCRE 不支援 (?{code}) 和 (??{code}) 建構。但是,它支援遞迴模式。
  8. 在撰寫本文時,Perl 5.005_02 中存在一些關於在模式部分重複時設定捕獲字串的古怪之處。例如,將 "aba" 與模式 /^(a(b)?)+$/ 匹配會將 $2 設定為值 "b",但將 "aabbaa" 與 /^(aa(bb)?)+$/ 匹配會使 $2 保持未設定狀態。但是,如果將模式更改為 /^(aa(b(b))?)+$/,則會設定 $2(和 $3)。在 Perl 5.004 中,兩種情況下都會設定 $2,而 PCRE 也是如此。如果將來 Perl 更改為不同的一致狀態,PCRE 也可能會隨之更改。
  9. 另一個尚未解決的差異是,在 Perl 5.005_02 中,模式 /^(a)?(?(1)a|b)+$/ 匹配字串 "a",而在 PCRE 中則不匹配。但是,在 Perl 和 PCRE 中,/^(a)?a/ 與 "a" 匹配都會使 $1 保持未設定狀態。
  10. PCRE 提供了一些 Perl 正規表示式功能的擴充。

    1. 雖然回溯斷言 (lookbehind assertion) 必須匹配固定長度的字串,但回溯斷言的每個替代分支可以匹配不同長度的字串。Perl 5.005 要求它們都具有相同的長度。
    2. 如果設定了 PCRE_DOLLAR_ENDONLY 且未設定 PCRE_MULTILINE,則 $ 元字元僅匹配字串的最末端。
    3. 如果設定了 PCRE_EXTRA,則反斜線後接沒有特殊含義的字母會被視為錯誤。
    4. 如果設定了 PCRE_UNGREEDY,則重複量詞的貪婪性會被反轉,也就是說,預設情況下它們不貪婪,但如果後面跟著一個問號,則它們是貪婪的。

新增註解

使用者貢獻的註解

此頁面沒有使用者貢獻的註解。
To Top