quotemeta EXPR
quotemeta

傳回 EXPR 的值,所有非 ASCII「字元」字元都加上反斜線。 (也就是說,所有不符合 /[A-Za-z_0-9]/ 的 ASCII 字元在傳回的字串中都會加上反斜線,不論任何區域設定。) 這是實作雙引號字串中 \Q 逸出的內部函數。 (請參閱下方關於非 ASCII 碼點的行為。)

如果省略 EXPR,則使用 $_

在將字串內插到正規表示式時,quotemeta (和 \Q ... \E) 很實用,因為預設上內插的變數會被視為迷你正規表示式。例如

my $sentence = 'The quick brown fox jumped over the lazy dog';
my $substring = 'quick.*?fox';
$sentence =~ s{$substring}{big bad wolf};

會讓 $sentence 變成 'The big bad wolf jumped over...'

另一方面

my $sentence = 'The quick brown fox jumped over the lazy dog';
my $substring = 'quick.*?fox';
$sentence =~ s{\Q$substring\E}{big bad wolf};

my $sentence = 'The quick brown fox jumped over the lazy dog';
my $substring = 'quick.*?fox';
my $quoted_substring = quotemeta($substring);
$sentence =~ s{$quoted_substring}{big bad wolf};

都會讓句子維持原狀。通常,在從使用者接受字面字串輸入時,必須使用 quotemeta\Q

請注意,如果您在 \Q\E 之間放置字面反斜線 (不在內插變數中),雙引號反斜線內插可能會導致令人困惑的結果。如果您需要\Q...\E 中使用字面反斜線,請參閱 "perlop 中引號建構的解析細節"

由於 "\Q 字串 \E" 的結果所有元字元都加上引號,因此無法在 \Q\E 對中插入字面的 $@。如果加上 \ 保護,$ 會加上引號變成 "\\\$";如果沒有,它會被解釋為內插純量的開頭。

在 Perl v5.14 中,所有非 ASCII 字元都會在非 UTF-8 編碼字串中加上引號,但在 UTF-8 字串中不會加上引號。

從 Perl v5.16 開始,Perl 採用 Unicode 定義的策略來加上非 ASCII 字元的引號;ASCII 字元的引號方式不變。

當在 use feature 'unicode_strings' 範圍之外時,非 UTF-8 字串的引號用法也保持不變,也就是將所有拉丁文 1 字元範圍內的字元加上引號。這提供舊程式完全的向下相容性,這些程式不使用 Unicode。(注意,unicode_strings 會在 use v5.12 或更高版本的範圍內自動啟用。)

use locale 範圍內,所有非 ASCII 拉丁文 1 編碼點都會加上引號,不論字串是否編碼為 UTF-8。如上所述,區域設定不會影響 ASCII 範圍字元的引號用法。這可以避免在某些區域設定中,字元(例如 "|")被視為字元字元。

否則,Perl 會使用 Unicode 改編版來為非 ASCII 字元加上引號(請參閱 https://www.unicode.org/reports/tr31/)。唯一會加上引號的編碼點是具有下列任何 Unicode 屬性的編碼點:Pattern_Syntax、Pattern_White_Space、White_Space、Default_Ignorable_Code_Point 或 General_Category=Control。

在這些屬性中,最重要的兩個屬性是 Pattern_Syntax 和 Pattern_White_Space。Unicode 設定這兩個屬性,就是為了明確決定正規表示式模式中哪些字元應該加上引號。在識別碼中可以出現的字元都不具備這些屬性。

Perl 保證,如果我們要將正規表示式模式的元字元新增到已定義的十幾個元字元(\ | ( ) [ { ^ $ * + ? .),我們只會使用具有 Pattern_Syntax 屬性的元字元。Perl 也保證,如果我們要新增在正規表示式中被視為空白的字元(目前主要受 /x 影響),它們都將具有 Pattern_White_Space 屬性。

Unicode 保證具有這兩個屬性的編碼點集合永遠不會改變,因此在 v5.16 中不需要加上引號的字元,在任何未來的 Perl 版本中都不需要加上引號。(並非所有符合 Pattern_Syntax 的編碼點都實際上已指派字元;因此還有成長空間,但無論是否已指派,都會加上引號。當然,Perl 永遠不會將未指派的編碼點用作實際的元字元。)

引用具有其他 3 個屬性的字元是為了增強正規表示式的可讀性,而不是因為它們實際上需要為了正規表示式目的而被引用(具有 White_Space 屬性的字元在頁面或螢幕上可能與具有 Pattern_White_Space 屬性的字元無法區分;其他兩個屬性包含非列印字元)。