【问题标题】:Perl regex directly escaping special charactersPerl 正则表达式直接转义特殊字符
【发布时间】:2017-12-30 17:21:46
【问题描述】:

这里是 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

谁能解释这种行为,并说明是否存在可以直接引用特殊字符而不使用反斜杠的替代方法?

【问题讨论】:

  • 没有好的替代品,这就是反斜杠存在的原因。 :P
  • 单行比正确的程序文件更难获得正确的程序文件,use strictuse warnings 和适当的变量声明到位。老实说,我没有任何理由编写单行 Perl 程序,除非它是 Linux 文化的一部分,带有一次性的管道 bash 命令链,而且它肯定不是开始学习该语言的好地方。将您的 Perl 放在一个文件中并从 IDE 运行它:它会更易于理解和调试,不太可能让您养成不良的编码习惯,并且代码将保留在磁盘上供您再次打开和运行如有必要

标签: perl


【解决方案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

【讨论】:

  • 所以只有$ 的存在会有问题吗?如果有任何其他特殊字符序列,例如(~^,它应该可以工作,对吧?
  • @ 也可以开始插值。您也无法以这种方式转义分隔符。
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 2013-12-28
  • 2014-12-13
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
相关资源
最近更新 更多