为什么$ _ =〜"正则表达式"在Perl中有效?

Lan*_*ane 4 perl

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

$_ =~ m/regular expression/;

# and "m" can be omit
$_ =~ /regular expression/;
Run Code Online (Sandbox Code Playgroud)

我可以qr用来创建一个像这样的正则表达式引用:

my $regex = qr/regular expression/;
$_ =~ m/$regex/;

# and "m//" can be omit:
$_ =~ $regex;
Run Code Online (Sandbox Code Playgroud)

但我试过这个:

my $str = "regular expression";
$_ =~ $str; # why this is valid?
Run Code Online (Sandbox Code Playgroud)

它没有给我任何错误信息,并且工作正常.我不知道为什么,我认为应该是这样的:

my $str = "regular expression";
$_ =~ m/$str/;

# or
my $str = "regular expression";
my $regex = qr/$str/;
$_ =~ $regex;
Run Code Online (Sandbox Code Playgroud)

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

zdi*_*dim 7

在perlre的"基础知识"中说

尚未存储在某个变量中的模式必须在两端用分隔符字符分隔.

(以及错误的tt`)

因此,变量中的模式不需要分隔符.操作员=~在讨论中perlop中"绑定运营商"

将标量表达式绑定到模式匹配.

(以我为重点)

如果右参数是表达式而不是搜索模式,替换或音译,则在运行时将解释为搜索模式.

操作员不关心右侧的分隔符,并且可以在运行时从表达式中形成"正则表达式".

该部分在perlop中"解析引用构造的血淋淋的细节"有助于这一点为好,除了是在自己的权利照明.识别出引用的构造并插入包含的文本之后,它将弹出"解析正则表达式"的子弹

在上面描述的预处理之后......结果字符串被传递给RE引擎进行编译.

(我的重点)

这是对Perl如何处理引用构造的一般性讨论,并且一旦字符串由引用的构造形成,就不需要(额外)分隔符.该m/RE/(等)出现在靠前的"讨论插值 "子弹,什么显示了一些不能用一个模式一个普通的字符串中使用的东西,但是这显然不是强制性的有.

我建议不要这样做; 使用qr,如你所料.首先,使用字符串(而不是使用内置的正则表达式qr)是有限的.而且,它更容易出现愚蠢的错误.


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

......神奇地区别于包含相同字符的字符串......

首先,请记住,qr您可以使用修饰符.