我知道在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中有效?
尚未存储在某个变量中的模式必须在两端用分隔符字符分隔.
(以及错误的tt`)
因此,变量中的模式不需要分隔符.操作员=~
在讨论中perlop中"绑定运营商"
将标量表达式绑定到模式匹配.
(以我为重点)
如果右参数是表达式而不是搜索模式,替换或音译,则在运行时将其解释为搜索模式.
操作员不关心右侧的分隔符,并且可以在运行时从表达式中形成"正则表达式".
该部分在perlop中"解析引用构造的血淋淋的细节"有助于这一点为好,除了是在自己的权利照明.识别出引用的构造并插入包含的文本之后,它将弹出"解析正则表达式"的子弹
在上面描述的预处理之后......结果字符串被传递给RE引擎进行编译.
(我的重点)
这是对Perl如何处理引用构造的一般性讨论,并且一旦字符串由引用的构造形成,就不需要(额外)分隔符.该m/RE/
(等)出现在靠前的"讨论插值 "子弹,什么显示了一些不能用一个模式一个普通的字符串中使用的东西,但是这显然不是强制性的有.
我建议不要这样做; 使用qr
,如你所料.首先,使用字符串(而不是使用内置的正则表达式qr
)是有限的.而且,它更容易出现愚蠢的错误.
请注意,虽然对于许多模式,可以使用qr
或""
(或其运算符形式qq()
)来准备模式(或将以这种方式解释的字符串) - 它们不相同.他们的引用规则非常相似,但是qr
准备一个正则表达式,正如Regexp Quote-Like Operators中所做的那样
......神奇地区别于包含相同字符的字符串......
首先,请记住,qr
您可以使用修饰符.