当Perl正则表达式插值关闭时,哪些转义字符被排除在外?

4
我很好奇当Perl正则表达式中的插值被关闭时,例如使用撇号(单引号)作为m''的定界符时,会排除哪些转义序列的匹配,并且为什么。在perlop中,关于插值的描述提到:

此阶段不执行任何插值。在解析正则表达式时,将处理任何反斜杠序列,包括\\

但是,在perlre中找到的转义序列的测试表明,并非所有转义序列的处理方式相同。
因此,我已经测试了perlre中“转义序列”部分列出的所有简单转义,发现有些“关闭”,而有些“开启”。似乎“打开”和“关闭”之间与perlrebackslash中的“字符转义”和“转义修改器”描述之间有一种对应关系。到目前为止,我尚未测试该页面上列出的所有可能转义,只测试了这两个组中的一些转义。
即使我测试了所有可能的转义字符,我仍不确定为什么当插值关闭时某些转义字符仍然有效,而其他转义字符却无效。有人可以启发我吗?
更新:如@tchrist建议的那样,这里是一些示例。 我基本上使用以下shell代码的变体来针对来自STDIN的某些用户输入进行测试:
perl -e "use 5.012; while(<>) { say 'YES' if m'\t';}"

当在非插值匹配结构中使用转义字符 \e, \f, \n, \r\t,例如 m'\t'(等等),它们仍然会匹配特殊字符而不是字面字符串表示。这与我在使用插值匹配形式时看到的匹配行为相同(例如 m/\t/),这就是我所说的“工作”的意思。

另一方面,像 \L, \U, \l\u 这样的修饰符在 m'' 中与 m// 中的功能不同。例如,m'\uthis' 不匹配输入:"This is a string," 而 m/\uthis/ 可以匹配这样的输入。第一种形式可以匹配输入:"\uthis is a string."


2
“discluded”?你一直在使用这个词,我不认为你知道它的意思是什么。 - user554546
好的,我应该写成“排除”。但是快速搜索显示,“disclude”的常见用法与“exclude”相同。 - cljacobs
不是。 - user554546
1
请举例说明哪些是“有效”的,哪些是无效的。 - tchrist
@cljacobs 你应该自己回答并接受你的答案。我想补充一点,' 转义也是有效的。 - Jonathan Mee
1个回答

1

Its the difference between single quoted string and double quoted string, those rules are seperate from regex patterns

so m'$foo' is like '$foo' and not like "$foo"

use Data::Dump;
$foo = 12;
dd qr/$foo/i;
dd qr'$foo'i;
__END__
qr/12/i
qr/$foo/i

so if using interpolation, you're matching 12 and if you've disabled interpolation, you're matching $, the end of line (or string) followed by foo

More on this in http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators

update: on a side note, in addition to Data::Dump, both Data::Dumper and Data::Dump::Streamer "dump" qr'$foo'i erroneously as qr/$foo/i


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接