在Perl中,m/PATTERN/和/PATTERN/有什么区别?

13

在Perl中,以下代码段之间是否存在任何技术差异?它们似乎表现相同。

my $str = "A cat is red";

if($str =~ /cat/) {
    print "Matches\n";
}

对比

my $str = "A cat is red";

if($str =~ m/cat/) {
    print "Matches\n";
}

这段代码的差异在于第三行的 "m"。为什么有些人会省略或不省略这个 "m"?


3
它有助于解析器,可能是当分隔符改变为除 / 以外的其他字符时,或者未使用 =~ 运算符且语法模糊不清时。(但我并不是 Perl 专家) - user557597
例如 @array = m/(\w+)/g; 这可能是一个常见的用法。 - user557597
2个回答

22

参见RegExp Quote-Like Operators文档:它们是相同的。 m "版本"允许您使用其他字符代替斜杠/作为分隔符。 但是除此之外,没有区别。


2
此外,我的偏好是使用m版本以保持类似符号的一致性,例如m//s///tr//qr//qw//q//qq//等。我发现在阅读代码时保持一致性更容易让人眼睛舒服。 - Chris
2
最后,我通常使用#号代替斜杠/,因为它们不是我经常需要在其中使用的字符,因此需要转义的情况较少,例如m## - Chris
@Chris,我觉得这很糟糕。它让 qw 看起来像 s///。我故意不使用 / 作为分隔符,除了正则表达式操作符和 tr。不同的东西之间的一致性是一件坏事。不同的东西应该看起来不同。 - ikegami
1
@Chris,我更倾向于鼓励在正则表达式中添加注释而不是防止它们存在!“ #”是一个糟糕的正则表达式定界符。 - ikegami
@ikegami 我个人的偏好如上所述,对我来说效果最佳。关于大规模代码的一致性,我持有不同意见,但我赞成在正则表达式模式中鼓励注释。我倾向于编写场景测试,而不是注释这些测试,我应该两者兼顾。 - Chris
显示剩余6条评论

11

没有区别。

/.../m/.../ 的缩写,就像 '...'q'...' 的缩写,"..."qq"..." 的缩写。

如果你要使用默认分隔符(正则表达式匹配用 /,单引号字符串字面量用 ',双引号字符串字面量用 "),可以省略前导字母。

指定前导字母允许您更改分隔符。

/.../      m/.../     m!...!     m{...}        Match operator
'...'      q'...'     q!...!     q{...}        Single-quoted string literal
"..."      qq"..."    qq!...!    qq{...}       Double-quoted string literal

这可以用于减少转义。例如,
/^http:\/\//

写成时更清晰

m{^http://}

否则,通常省略 "m"、"q" 或 "qq"。"s"、"tr" 和 "qw" 不是可选项。所有这些都在 perlop 中有记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接