代码之家  ›  专栏  ›  技术社区  ›  jjmerelo

m和rx之间有什么区别吗?

  •  8
  • jjmerelo  · 技术社区  · 6 年前

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

    1 回复  |  直到 6 年前
        1
  •  10
  •   Community ahmed    4 年前

    作为链接到州的文档,

    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␤»
    

    所以 /.../ 返回a Regex 对象,该对象可以作为值传递,并用于以后多次匹配,以及 m/.../ 返回a Match 立即执行匹配的对象。当您打印 火柴 对象,则得到匹配的结果,并且在打印 正则表达式 对象,则得到正则表达式的文本表示。使用 m// 在Perl 6中,您可以访问隐式 火柴 对象 $/ :

    匹配结果存储在 $/ 变量和也从匹配中返回。结果为类型 火柴 如果比赛成功;否则就是 Nil .

    这种区别与Python的类似 re.compile vs。 re.match / re.search ,Perl 5中也存在类似的区别,您可以使用 qr/.../ vs。 m// /.../ 用于直接匹配。正如@raiph指出的,并非所有 m// /.../ 导致直接匹配。相反地 Perl 5 precompiles literal (static) regexes 即使没有明确要求。(据推测,Perl 6也会执行此优化。)