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

问题描述

来自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中进行了说明。基本上(?:)创建一个带有内置标志的子模式,而^指出不存在哪些标志。您也可以在其他模式中使用此功能,例如,为模式的某些部分打开和关闭不区分大小写。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...