Perl中/.../和m /.../之间的区别

ssr*_*012 3 perl

/.../和之间有什么区别m/.../

use strict;
use warnings;

my $str = "This is a testing for modifier";

if ($str =~ /This/i) { print "Modifier...\n";  }
if ($str =~ m/This/i) { print "W/O Modifier...\n";  }
Run Code Online (Sandbox Code Playgroud)

但是,我查了一下这个网站的参考资料并没有清楚地理解这个理论

Sob*_*que 11

没有区别.如果你只是供应,/PATTERN/那么它假定m.但是,如果您使用的是替代分隔符,则需要提供m.例如,m|PATTERN|不会起作用|PATTERN|.

在您的示例中,i修饰符是在模式之后.m是操作.(相对于s,tr,y等等)

也许有点令人困惑 - 你可以m用作修饰语,但只有在比赛结束后才能使用.

m/PATTERN/m将导致^$匹配不同于in m/PATTERN/,但它m是执行此操作的尾随,而不是前导.


Dav*_*oss 6

Perl有许多类似报价的运算符,您可以在其中选择分隔符以适合您传递给运算符的数据.

  • q(...) 创建单引号字符串
  • qq(...) 创建一个双引号字符串
  • qw(...) 通过在白色空间上分割其参数来创建列表
  • qx(...) 执行命令并返回输出
  • qr(...) 编译正则表达式
  • m(...) 将其参数与正则表达式匹配

(也有,s(...)(...)但我已经把它从列表中删除,因为它有两个参数)

对于其中一些,如果选择默认分隔符,则可以省略运算符开头的字母.

  • q如果使用单引号字符('...'),则可以省略.
  • qq如果使用双引号字符("..."),则可以省略.
  • qx如果使用反引号(`...`),则可以省略.
  • m如果使用斜杠(/.../),则可以省略.

因此,要回答原始问题,m/.../并且/.../是相同的,但因为斜杠是匹配运算符的默认分隔符,所以可以省略m.