Regular-Expression

Perl 中的 Perl 變數擴展 m//

  • May 29, 2020

Perl 如何在m//匹配運算符中進行變數擴展?我讀過的是,m//變數擴展/插值只做一次。但是,為什麼我會Unmatched ( in regex$pat擴展時得到?

my $pat = '(\\)';
'\\' =~ /(\\)/  ? print "OK\n" : print "NO MATCH!\n";   # OK
'\\' =~ /$pat/  ? print "OK\n" : print "NO MATCH!\n";   # Unmatched ( in regex

my $pat2 = '(\\\)';
'\\' =~ /$pat2/  ? print "OK\n" : print "NO MATCH!\n";  # OK

您的問題是您誤用或記錯了有關反斜杠的神秘規則。

單引號字元串文字中,

反斜杠表示反斜杠,除非後跟分隔符或另一個反斜杠,在這種情況下,分隔符或反斜杠被插值。

所以 的值$pat是三個字元的字元串(\),因為原始碼中的反斜杠後面跟著另一個反斜杠,這代表一個反斜杠。的值$pat2是四個字元的字元串(\\),因為原始碼中的前兩個反斜杠代表一個反斜杠,第三個反斜杠後面跟著,)所以它單獨作為字元串中的第二個反斜杠。

正則表達式中,反斜杠引用下一個字元,除非它是字母數字。/$pat/等效於/(\)/,它是開組,後跟文字右括號,並且)缺少關閉組的 。/$pat2/相當於/(\\)/哪個是 open-group,反斜杠,close-group。

引用自:https://unix.stackexchange.com/questions/589824