M和RX之间有什么区别吗?

8

在文档中,它们似乎可以互换使用。是否有任何区别,甚至是意图上的区别?


1
最开始的链接说道 m/.../ 是一个正则表达式,它会立即与 $_ 进行匹配。这不就是不同之处吗? - Sweeper
@SimonShine,但在文本的其余部分中它们是可以互换使用的。此外,say 'ðu' ~~ rx/.u/; say 'ðu' ~~ m/.u/; #OUTPUT: «「ðu」␤「ðu」␤»m未立即与$_匹配。 - jjmerelo
1
m/.../ 相当于一个显式且立即调用的代码块,例如 { say 42 }(),而 /.../rx/.../ 则相当于一个代码块,例如 { say 42 },如果它在语句/汇流处上下文中,则隐式立即调用,否则只是一个代码块,在作为值时尚未被调用。 - raiph
1
(仅供完整性考虑,我相信 rx/...//.../ 是可以互换的。) - raiph
1
请参阅为什么//和m//不完全是同义词? - Christopher Bottoms
显示剩余2条评论
1个回答

10

正如您所链接的文档所述,

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对象$/

匹配结果存储在 $ / 变量中,也从匹配中返回。如果匹配成功,则结果类型为 Match ;否则为 Nil

这种区别类似于Python中的re.compilere.match/re.search之间的区别,在Perl 5中也存在类似的区别,你可以使用qr/.../来存储和重复使用正则表达式,而使用m/...//.../进行直接匹配。正如@raiph所指出的那样,并非所有m/...//.../的出现都会导致直接匹配。相反地,Perl 5会即使没有明确要求,也会预编译字面(静态)正则表达式。(大概,Perl 6也执行了这种优化。)

3
抱歉,在注意到你需要留下评论中的细节后,我不小心删除了我的评论。但我在问题的评论中也提到了同样的观点。在P5中,正则表达式是字符串,如果它们完全是静态的,则可以编译。在P6中,正则表达式是代码,始终会被编译,但可能包含动态元素。 - raiph

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