Regex “这是什么意思?”;你可以’;t在正则表达式构造中隐藏模式的终止分隔符";在;编程Perl;?

Regex “这是什么意思?”;你可以’;t在正则表达式构造中隐藏模式的终止分隔符";在;编程Perl;?,regex,perl,Regex,Perl,很抱歉,我再次需要帮助来理解《Perl编程》一书中相当复杂的片段。在这里(我不太清楚的标记为粗体): 模式被解析为双引号字符串,所有正常的双引号约定都将起作用,包括变量插值(除非使用单引号) 作为分隔符)和用反斜杠转义表示的特殊字符。在将字符串解释为正则表达式(这是 在Perl语言中,很少有地方字符串经过多次 处理) 这两次解析的另一个结果是,普通的Perl标记器 首先查找正则表达式的结尾,就像它正在查找 终止普通字符串的分隔符。只有在它找到结束 string(并完成任何变量插值)是被视为规则的

很抱歉,我再次需要帮助来理解《Perl编程》一书中相当复杂的片段。在这里(我不太清楚的标记为粗体):

模式被解析为双引号字符串,所有正常的双引号约定都将起作用,包括变量插值(除非使用单引号) 作为分隔符)和用反斜杠转义表示的特殊字符。在将字符串解释为正则表达式(这是 在Perl语言中,很少有地方字符串经过多次 处理)

这两次解析的另一个结果是,普通的Perl标记器 首先查找正则表达式的结尾,就像它正在查找 终止普通字符串的分隔符。只有在它找到结束 string(并完成任何变量插值)是被视为规则的模式 表情。除此之外,这意味着您不能“隐藏”终止 正则表达式构造内部模式的分隔符(如括号中的字符类 或者一个regex注释,我们还没有讨论)。Perl将看到分隔符 无论它在哪里,并在该点终止模式

首先,为什么只在找到字符串的结尾后才说
,而不是像前面所说的
它正在查找的正则表达式的结尾

其次,它是什么意思
不能在正则表达式构造中“隐藏”模式的终止分隔符?为什么我不能隐藏终止定界符
/
,而我可以将它直接放置在regexp
/A\/C/
或插值变量中(即使没有
\
):

输出
1

当我在写和重读我的问题时,我认为这段代码讲述了如何使用一个引号作为regexp分隔符,那么这一切看起来都很内聚。我的假设正确吗?

非常感谢。

它说的是“字符串的结尾”,而不是“正则表达式的结尾”,因为在这一点上,它将正则表达式视为一个字符串

它试图说这是行不通的:

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

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

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

假设您想要匹配一个
*
。您可以使用

m/\*/
但是,如果您使用
*
作为分隔符,该怎么办?以下情况不起作用:

m*\**
因为它被解释为

m/*/
如下所示:

$ perl -e'm*\**'
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at -e line 1.
它产生字符串

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

即便如此,这也不完全正确——一些正则表达式分隔符,如
m{}
,是可以嵌套的“特殊”的。例如,
m{}
可以工作。(第一个
}
不被视为分隔符;只有第二个是。)@Dashwuff,但这是一个字符串构造,而不是正则表达式构造。
q{}
的工作方式完全相同;它相当于
'{}“
。非常非常复杂的书。在我看来,这件相当简单的事情可以用一种更具消化力的方式来描述。@caligula:别自欺欺人。Perl解析是复杂的东西。非常复杂,除了
Perl
本身,几乎没有任何东西能百分之百地正确理解它。这种语言是由一位语言学爱好者编写的,他是ten希望语法更自然,而不是更容易解析。哎呀!有人会选择
'*'
作为分隔符!!哎呀,这篇文章实际上是在谈论@cjm提到的内容。我将不删除我的文章,因为它有点相关。你能解释一下
m*\**
为什么不起作用吗?据我所知,首先是interpreter将
**
作为双引号字符串。第二,它进行插值并抛出
`。第三,它将剩余的
*`视为regexp模式。但是为什么
`在
m/*/`中工作?或者我最好问一个新问题?
a*b
m*a\*b*      ===  m/a*b/       matches pattern a*b
m*a\x{2A}b*  ===  m/a\*b/      matches pattern a\*b