3

抱歉,但我再次需要帮助来理解“Programming Perl”一书中相当复杂的片段。这是(标记为粗体对我来说晦涩难懂的内容):

模式被解析为双引号字符串,所有正常的双引号约定都将起作用,包括变量插值(除非您使用单引号作为分隔符)和用反斜杠转义指示的特殊字符。这些是在字符串被解释为正则表达式之前应用的(这是 Perl 语言中为数不多的几个地方之一,其中字符串经历了不止一次的处理)。...

这种两次解析的另一个结果是普通的 Perl 标记器首先找到正则表达式的结尾,就像它正在寻找普通字符串的终止分隔符一样。只有在找到字符串的结尾(并完成任何变​​量插值)之后,模式才会被视为正则表达式。除此之外,这意味着您不能“隐藏”正则表达式结构中模式的终止分隔符(例如括号字符类或正则表达式注释,我们还没有涉及)。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

当我在写和重新阅读我的问题时,我认为这个片段讲述了使用单引号作为正则表达式分隔符,那么这一切似乎都很有凝聚力。我的假设正确吗?

我的赞赏。

4

2 回答 2

7

它说“字符串的结尾”而不是“正则表达式的结尾”,因为此时它将正则表达式视为只是一个字符串。

它试图说这不起作用:

/foo[-/_]/

即使普通的正则表达式元字符在内部并不特殊[],Perl 仍会将正则表达式视为/foo[-/并抱怨未终止的类。

它试图说 Perl 在读取它时不会解析正则表达式。首先它会在源代码中找到正则表达式的结尾,就好像它是一个带引号的字符串,所以唯一的特殊字符是\. 然后它插入任何变量。 然后它将结果解析为正则表达式。

您可以隐藏终止分隔符,\因为它适用于普通字符串。您可以将定界符隐藏在插值变量中,因为插值发生在找到定界符之后。如果您使用括号分隔符(例如{ }[ ]),您可以在正则表达式中嵌套匹配的分隔符对,因为q{}也可以这样工作。但是您不能将其隐藏在任何其他正则表达式构造中。

于 2012-07-31T16:57:59.423 回答
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
于 2012-07-31T17:00:41.840 回答