Perl正则表达式直接转义特殊字符

问题描述 投票:0回答:1

这是一个perl初学者。我一直在研究一些简单的单行程序来查找和替换文件中的文本。我读到了使用\Q\Equotemeta()转义所有特殊字符,但发现这只适用于插值变量。例如,当我尝试直接替换包含特殊字符的部分时,它会失败。但是当我将它存储在标量中时它首先起作用。当然,如果我逃避反斜杠中的所有特殊字符,它也可以工作。

$ echo 'One$~^Three' | perl -pe 's/\Q$~^\E/Two/'
One$~^Three
$ echo 'One$~^Three' | perl -pe '$Sub=q($~^); s/\Q$Sub\E/Two/'
OneTwoThree
$ echo 'One$~^Three' | perl -pe 's/\$\~\^/Two/'
OneTwoThree

任何人都可以解释这种行为,并显示是否存在任何可以直接引用特殊字符而不使用反斜杠的替代方法?

perl
1个回答
1
投票

插值首先发生,然后\Q\U\u\L\l

这意味着

"abc\Qdef$ghi!jkl\Emno"

相当于

"abc" . quotemeta("def" . $ghi . "!jkl") . "mno"

所以,

s/\Q$~^/Two/    # not ok   quotemeta($~ . "^")
s/\Q$Sub/Two/   # ok
s/\$\~\^/Two/   # ok
s/\$\Q~^/Two/   # ok
© www.soinside.com 2019 - 2024. All rights reserved.