gpt4 book ai didi

perl - 为什么 $_ =~ "regular expression"在 Perl 中有效?

转载 作者:行者123 更新时间:2023-12-03 12:14:42 24 4
gpt4 key购买 nike

我知道在 Perl 中,最常见的有效正则表达式是这样的:

$_ =~ m/regular expression/;

# and "m" can be omit
$_ =~ /regular expression/;

我可以使用 qr 创建一个像这样的正则表达式引用:
my $regex = qr/regular expression/;
$_ =~ m/$regex/;

# and "m//" can be omit:
$_ =~ $regex;

但我试过这个:
my $str = "regular expression";
$_ =~ $str; # why this is valid?

它没有给我任何错误信息并且工作正常。不知道为什么,我觉得应该是这样的:
my $str = "regular expression";
$_ =~ m/$str/;

# or
my $str = "regular expression";
my $regex = qr/$str/;
$_ =~ $regex;

谁能解释为什么 $_ =~ $str 在 Perl 中有效?

最佳答案

它在 "The basics" in perlre 下说

Patterns that aren't already stored in some variable must be delimitted, at both ends, by delimitter characters.



(以及 delimite(d/r) 中不正确的 double-t )

因此,变量中的模式不需要分隔符。 "Binding operators" in perlop 中讨论的运算符 =~

binds a scalar expression to a pattern match.



和(我的重点)

If the right argument is an expression rather than a search pattern, substitution, or transliteration, it is interpreted as a search pattern at run time.



运算符不关心其右侧的分隔符,并且可以在运行时从表达式中形成“正则表达式模式”。

"Gory details of parsing quoted constructs" in perlop 部分除了本身具有启发性外,也对此有所帮助。在引用的构造被识别并插入包含的文本之后,它来到了“解析正则表达式”的项目符号

After preprocessing described above ... the resulting string is passed to the RE engine for compilation.



(我的重点)

这是关于 Perl 如何处理引用结构和
一旦字符串从引用的构造中形成,就不需要(额外的)分隔符。 m/RE/(等)在前面的“插值”项目符号中讨论过,它显示了一些不能与模式的普通字符串一起使用的东西,但这显然不是强制性的。

不过,我建议不要这样做;如您所料,使用 qr 。一方面,使用字符串(而不是使用 qr 构建的正则表达式)是有限制的。此外,它更容易出现愚蠢的错误。

请注意,虽然对于许多模式,可以使用 qr"" (或其运算符形式 qq() )来准备模式(或将以这种方式解释的字符串)——但它们并不相同。它们的引用规则非常相似,但 qr 准备了一个正则表达式,如放入 Regexp Quote-Like Operators

... magically differs from a string containing the same characters ...



一方面,回想一下,使用 qr 您可以使用修饰符。

关于perl - 为什么 $_ =~ "regular expression"在 Perl 中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52453534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com