在“Programming Perl”中,“你无法隐藏正则表达式结构中模式的终止分隔符”是什么意思?

时间:2012-07-31 16:42:08

标签: regex perl

很抱歉,但我需要帮助才能理解“编程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

当我写作并重新阅读我的问题时,我认为这个片段讲述了使用单引号作为正则表达式分隔符,然后它们似乎都非常有凝聚力。我的假设是否正确?

我的感激。

2 个答案:

答案 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