这是一个perl初学者。我一直在研究一些简单的单行程序来查找和替换文件中的文本。我读到了使用\Q\E
或quotemeta()
转义所有特殊字符,但发现这只适用于插值变量。例如,当我尝试直接替换包含特殊字符的部分时,它会失败。但是当我将它存储在标量中时它首先起作用。当然,如果我逃避反斜杠中的所有特殊字符,它也可以工作。
$ 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
任何人都可以解释这种行为,并显示是否存在任何可以直接引用特殊字符而不使用反斜杠的替代方法?
插值首先发生,然后\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