问题描述
来自Perldoc:
qr/STRING/msixpodualn
该运算符将其STRING引为常规字符串(并可能对其进行编译) 表达。 对STRING进行插值的方式与PATTERN在 m / PATTERN / 。
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)
)在in perlre中进行了说明。基本上(?:)
创建一个带有内置标志的子模式,而^
指出不存在哪些标志。您也可以在其他模式中使用此功能,例如,为模式的某些部分打开和关闭不区分大小写。