【问题标题】:Any difference between m and rx?m 和 rx 有什么区别?
【发布时间】:2018-05-01 06:53:31
【问题描述】:

他们似乎是used interchangeably in the documentation。有什么不同,即使是在意图上?

【问题讨论】:

  • 一开始的链接说m/.../是一个正则表达式,它立即与$_匹配。这不是区别吗?
  • 是的,您链接到的文章指出了差异。 rx/...//.../ 一样,是一个可以匹配的正则表达式对象,而m/.../ 则直接返回匹配项。
  • m/.../ 类似于 明确且始终立即调用 代码块,例如 { say 42 }(),而 /.../rx/.../ 类似于代码块,例如{ say 42 } 或者如果它在语句/接收器上下文中只是一个代码块,当它被用作值时,它还没有被调用。跨度>
  • (为了完整起见,我很确定rx/...//.../ 可以互换。)

标签: regex syntax raku


【解决方案1】:

作为您链接到状态的文档,

m/abc/;         # a regex that is immediately matched against $_
rx/abc/;        # a Regex object
/abc/;          # a Regex object

[...] m/ // / 运算符之间的区别示例:

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 precompiles literal (static) regexes 即使没有明确要求它。 (大概 Perl 6 也进行了这种优化。)

【讨论】:

  • 糟糕,删除了我的评论,然后才注意到您的编辑依赖于我留下的详细信息。但我在对这个问题的评论中涵盖了同样的观点。在 P5 中,正则表达式是 strings,如果它们完全是静态的,则可以编译它们。在 P6 中,正则表达式是始终编译但可能包含动态元素的 代码
猜你喜欢
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
相关资源
最近更新 更多