Perl 中的 qr/ 和 m/ 有什么区别?

Lou*_*Lou 3 regex perl precompiled

来自 Perldoc:

qr/STRING/msixpodualn
Run Code Online (Sandbox Code Playgroud)

该运算符将其 STRING 引用(并可能编译)为正则表达式。STRING 的插值方式与 m/PATTERN/ 中的 PATTERN 相同

m/PATTERN/msixpodualngc
/PATTERN/msixpodualngc
Run Code Online (Sandbox Code Playgroud)

在字符串中搜索模式匹配,在标量上下文中,如果成功则返回 true,如果失败则返回 false。如果没有通过 =~ 或 !~ 运算符指定字符串,则搜索 $_ 字符串。(用 =~ 指定的字符串不必是左值 - 它可能是表达式求值的结果,但请记住 =~ 绑定得相当紧密。)另请参阅 perlre。

选项如上面 qr// 中所述

我确信我错过了一些明显的东西,但我根本不清楚这些选项有何不同 - 它们看起来基本上是同义词。你什么时候会使用qr//代替m//,反之亦然?

sim*_*que 5

m//运算符用于匹配,而qr//生成一个模式(作为字符串),您可以将其粘贴在变量中并存储以供以后使用。这是一个引用的正则表达式模式。

这种方式预编译对于优化运行时成本非常有用,例如,如果您在具有数百万次迭代的循环中使用固定模式,或者您希望在函数调用之间传递模式或在调度表中使用它们。

# match now
if ( $foo =~ m/pattern/ ) { ... }

# compile and use later
my $pattern = qr/pattern/i;
print $pattern;                      # (?^ui:pattern)

if ($foo =~ m/$pattern/) { ... }
Run Code Online (Sandbox Code Playgroud)

字符串的结构(在本例中为)在 perlre 中(?^ui:pattern)进行了解释。基本上创建一个带有内置标志的子模式,并说明不要有哪些标志。您也可以在其他模式中使用它,例如打开和关闭模式部分的不区分大小写。(?:)^