来自Perldoc:
qr/STRING/msixpodualn
此运算符将其STRING作为正则表达式引用(并可能编译(表示STRING的插值方式与中的PATTERN相同m/图案/。
m/PATTERN/msixpodualngc
/PATTERN/msixpodualngc
在字符串中搜索模式匹配,并在标量上下文中返回如果成功则为true,如果失败则为false。如果没有通过指定字符串=~或!~运算符,则搜索$_字符串。(字符串用=~指定不必是左值--它可能是表达式求值,但请记住=~绑定相当紧密。(看见还有佩尔雷。
选项如上文qr//所述
我肯定我错过了一些显而易见的东西,但我根本不清楚这些选项有什么不同——它们看起来基本上是同义的。您什么时候使用qr//
而不是m//
,反之亦然?
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/) { ... }
字符串(在本例中为(?^ui:pattern)
(的结构在perlre中进行了解释。基本上,(?:)
创建了一个具有内置标志的子模式,而^
则说明不应该具有哪些标志。您也可以在其他模式中使用它,例如,为模式的某些部分打开和关闭不区分大小写的功能。