4

我很好奇当插值被关闭时,哪些转义序列被排除在 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, 和\uinside of 的作用m''与 inside of 不同m//。例如m'\uthis'不匹配输入:“这是一个字符串”,而m/\uthis/匹配这样的输入。第一种形式匹配输入:“\uthis is a string”。

4

1 回答 1

1

它是单引号字符串和双引号字符串之间的区别,这些规则与正则表达式模式是分开的

所以m'$foo'喜欢'$foo'和不喜欢"$foo"

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

因此,如果使用插值,则匹配 12,如果禁用插值,则匹配$,行尾(或字符串)后跟 foo

更多信息请参见http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators

更新:附带说明,除了 Data::Dump 之外,Data::Dumper 和 Data::Dump::Streamer 都qr'$foo'i错误地“转储”为qr/$foo/i

于 2012-08-04T09:13:29.760 回答