很抱歉,但我需要帮助才能理解“编程Perl”一书中相当复杂的片段。在这里(对我来说模糊不清的是粗体):
模式被解析为双引号字符串,所有正常的双引号约定都可以使用,包括变量插值(除非你使用单引号 作为分隔符)和用反斜杠转义表示的特殊字符。这些是在将字符串解释为正则表达式之前应用的(这是其中之一) 在Perl语言中,字符串经过多次传递的几个地方 处理)。 ...
这种双遍解析的另一个结果是普通的Perl tokener 首先找到正则表达式的结尾,就好像它正在寻找 终止普通字符串的分隔符。只有在它找到了结尾之后 string (并完成任何变量插值)是被视为常规的模式 表达。除此之外,这意味着你不能“隐藏”终止 正则表达式构造内的模式的分隔符(例如括号内的字符类 或正则表达式评论,我们尚未涉及)。 Perl会看到分隔符 无论它在哪里,并在那时终止模式。
首先,如前所述,为什么说它Only after it has found the end of the string
而不是the end of the regular expression
?
其次,you can’t “hide” the terminating delimiter of a pattern inside a regex construct
是什么意思?为什么我无法隐藏终止分隔符/
,而我可以将它放在正则表达式/A\/C/
或插值变量(即使没有\
)的任何地方:
my $s = 'A/';
my $p = 'A/C';
say $p =~ /$s/;
输出1
。
当我写作并重新阅读我的问题时,我认为这个片段讲述了使用单引号作为正则表达式分隔符,然后它们似乎都非常有凝聚力。我的假设是否正确?
我的感激。
答案 0 :(得分:7)
它表示“字符串的结尾”而不是“正则表达式的结尾”,因为在那时它正在将正则表达式视为只是一个字符串。
它试图说这不起作用:
/foo[-/_]/
即使[]
内的正则正则表达式元字符不是特殊的,Perl会将正则表达式视为/foo[-/
并抱怨未终止的类。
它试图说Perl在读取它时不会解析正则表达式。首先,它在源代码中找到正则表达式的结尾,就好像它是一个带引号的字符串,因此唯一的特殊字符是\
。然后它插入任何变量。 然后它将结果解析为正则表达式。
您可以使用\
隐藏终止分隔符,因为它适用于普通字符串。您可以在插值变量中隐藏分隔符,因为在找到分隔符后会发生插值。如果您使用包围分隔符(例如{ }
或[ ]
),则可以在正则表达式中嵌套匹配的分隔符对,因为q{}
的工作方式也是如此。
但你无法将其隐藏在任何其他正则表达式构造中。
答案 1 :(得分:5)
假设您要匹配*
。你会用
m/\*/
但是,如果您使用的是*
作为分隔符,该怎么办?以下不起作用:
m*\**
因为它被解释为
m/*/
如下所示:
$ perl -e'm*\**'
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at -e line 1.
取字符串文字
"a\"b"
它产生字符串
a"b
同样,匹配运算符
m*a\*b*
生成正则表达式
a*b
如果要匹配文字*
,则必须使用其他方法。换句话说。
m*a\*b* === m/a*b/ matches pattern a*b
m*a\x{2A}b* === m/a\*b/ matches pattern a\*b