我很好奇当插值被关闭时,哪些转义序列被排除在 Perl 正则表达式中被匹配,比如使用撇号(单引号)作为分隔符m''
,以及为什么。perlop中插值的描述提到:
在这个阶段不执行插值。任何反斜杠序列包括
\\
在解析正则表达式的阶段被处理。
但是,对perlre中的转义序列的测试表明,并非所有的转义序列都被同等对待。
因此,我测试了perlre的“转义序列”部分中列出的所有简单转义,发现有些是“关闭”而有些是“打开”。perlrebackslash中的“on”和“off”转义与“字符转义”和“转义修饰符”描述之间似乎存在对应关系。到目前为止,我还没有测试过该页面上列出的所有可能的转义,只是来自这两组的那些。
即使我测试了所有可能的转义,我也不确定我是否理解为什么有些在插值关闭时仍然有效,而另一些则没有。任何人都可以启发我吗?
更新:正如@tchrist 所建议的,这里有一些例子。我基本上使用了以下 shell 代码的变体来针对来自 STDIN 的一些用户输入来测试这些代码:
perl -e "use 5.012; while(<>) { say 'YES' if m'\t';}"
转义\e
, \f
, \n
, \r
, 和\t
, 当在非插值匹配结构中使用时,例如m'\t'
(etc.) 仍将匹配它们转义的特殊字符,而不是它们的文字字符串表示。这与我在使用插值匹配形式(例如m/\t/
)时看到的匹配行为相同,这就是我所说的仍在“工作”的意思。
另一方面,修饰符如\L
, \U
, \l
, 和\u
inside of 的作用m''
与 inside of 不同m//
。例如m'\uthis'
不匹配输入:“这是一个字符串”,而m/\uthis/
匹配这样的输入。第一种形式将匹配输入:“\uthis is a string”。