m和rx之间有什么区别?

jjm*_*elo 7 regex syntax perl6

它们似乎可以在文档中互换使用.即使是在意图中,有什么不同吗?

Sim*_*ine 10

作为链接到州的文档,

m/abc/;         # a regex that is immediately matched against $_
rx/abc/;        # a Regex object
/abc/;          # a Regex object
Run Code Online (Sandbox Code Playgroud)

[...]m/ // /运营商之间的差异示例:

my $match;
$_ = "abc";
$match = m/.+/; say $match; say $match.^name; # OUTPUT: «?abc??Match?» 
$match =  /.+/; say $match; say $match.^name; # OUTPUT: «/.+/?Regex?»
Run Code Online (Sandbox Code Playgroud)

因此/.../返回一个Regex可以作为值传递的对象,并用于稍后和多次匹配,并m/.../返回一个Match立即执行匹配的对象.当您打印Match对象时,您将获得匹配的结果,并且当您打印Regex对象时,您将获得正则表达式的文本表示.m/.../在Perl 6中使用允许您访问隐式Match对象,$/:

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

这种区别是相当于Python的re.compile主场迎战re.match/re.search以及类似的区分,Perl 5中存在,您可以存储并重新使用正则表达式用qr/.../m/...//.../用于直接匹配.正如@raiph指出的那样,并非所有出现m/...//.../导致直接匹配.相反,即使没有明确要求,Perl 5也会预编译文字(静态)正则表达式.(据推测,Perl 6也会执行此优化.)

  • 哎呀,删除了我的评论,然后注意到你的编辑依赖我留下来了解细节.但我在对这个问题的评论中也提到了同样的观点.在P5中,正则表达式是*字符串*,如果它们完全是静态的,则可以编译.在P6中,正则表达式是*代码*,它总是被编译但可能具有动态元素. (3认同)