在文档中,它们似乎可以互换使用。是否有任何区别,甚至是意图上的区别?
正如您所链接的文档所述,
所以
m/abc/; # a regex that is immediately matched against $_ rx/abc/; # a Regex object /abc/; # a Regex object
[...] Example of difference between
m/ /
and/ /
operators:my $match; $_ = "abc"; $match = m/.+/; say $match; say $match.^name; # OUTPUT: «「abc」Match» $match = /.+/; say $match; say $match.^name; # OUTPUT: «/.+/Regex»
/.../
返回一个Regex
对象,该对象可以作为值传递,并可用于稍后和多次匹配,而m/.../
返回一个Match
对象,立即执行匹配。当您打印Match
对象时,会得到匹配结果,而当您打印Regex
对象时,会得到正则表达式的文本表示形式。在Perl 6中使用m/.../
让您访问隐式的Match
对象$/
:
这种区别类似于Python中的匹配结果存储在
$ /
变量中,也从匹配中返回。如果匹配成功,则结果类型为Match
;否则为Nil
。
re.compile
和re.match
/re.search
之间的区别,在Perl 5中也存在类似的区别,你可以使用qr/.../
来存储和重复使用正则表达式,而使用m/.../
和/.../
进行直接匹配。正如@raiph所指出的那样,并非所有m/.../
和/.../
的出现都会导致直接匹配。相反地,Perl 5会即使没有明确要求,也会预编译字面(静态)正则表达式。(大概,Perl 6也执行了这种优化。)
m/.../
是一个正则表达式,它会立即与 $_ 进行匹配。这不就是不同之处吗? - Sweepersay 'ðu' ~~ rx/.u/; say 'ðu' ~~ m/.u/; #OUTPUT: «「ðu」「ðu」»
,m
未立即与$_
匹配。 - jjmerelom/.../
相当于一个显式且立即调用的代码块,例如{ say 42 }()
,而/.../
或rx/.../
则相当于一个代码块,例如{ say 42 }
,如果它在语句/汇流处上下文中,则隐式立即调用,否则只是一个代码块,在作为值时尚未被调用。 - raiphrx/.../
和/.../
是可以互换的。) - raiph