per /中的m/PATTERN /和/ PATTERN /之间的差异

use*_*867 13 regex perl match

perl中的以下代码段之间是否存在技术差异?他们似乎行为相同

my $str = "A cat is red";

if($str =~ /cat/) {
    print "Matches\n";
}
Run Code Online (Sandbox Code Playgroud)

VS

my $str = "A cat is red";

if($str =~ m/cat/) {
    print "Matches\n";
}
Run Code Online (Sandbox Code Playgroud)

这段代码的不同之处在于第3行的"m".为什么有人省略或不省略"m"?

Mat*_*Mat 22

请参阅RegExp Quote-Like Operators文档:它们完全相同.在m"版本"允许您使用其它字符,而不是/作为分隔符.但除此之外,没有区别.

  • 另外,我的偏好是使用m版本与类似的符号一致,即`m //`,`s ///`,`tr //``,`qr //`,`qw //`,`q //`,`qq //`等我在回读代码时发现眼睛的一致性更容易. (2认同)
  • 最后,代替/,我通常使用#,因为它们不是我经常需要在其中使用的字符,因此不那么"不整齐"的转义是必要的,即`m ##`. (2认同)

ike*_*ami 11

没有区别.

/.../是短暂的m/.../,就像'...'是短暂的q'...',"..."是短暂的qq"...".

如果您要使用默认分隔符(/对于正则表达式匹配,'对于单引号字符串文字和"双引号字符串文字),您可以省略前导字母.

指定前导字母可以更改分隔符.

/.../      m/.../     m!...!     m{...}        Match operator
'...'      q'...'     q!...!     q{...}        Single-quoted string literal
"..."      qq"..."    qq!...!    qq{...}       Double-quoted string literal
Run Code Online (Sandbox Code Playgroud)

这对减少转义很有用.例如,

/^http:\/\//
Run Code Online (Sandbox Code Playgroud)

写作时更清楚

m{^http://}
Run Code Online (Sandbox Code Playgroud)

否则,通常省略"m","q"或"qq"."s","tr"和"qw"不是可选的.

所有这些都记录在perlop中.