【问题标题】:How to parse a Module name canonically如何规范地解析模块名称
【发布时间】:2020-11-13 05:20:26
【问题描述】:

我有一个正则表达式,它解析一个字符串,该字符串应该是 Raku 的完全限定模块名称(见下文)。由于 Precomp 模块中似乎只使用了 auth、ver 和 api 版本,因此我只对其进行测试。

我需要将模块名称与标识符分开。

我的正则表达式是:

my $rx := /
                       ^
                       $<name> = ( [ \w | '::' ] + )
                       [ ':' $<part> = ( [ 'ver' | 'auth' | 'api' ] )
                        \< ~ \> $<val> = ( .*? ) ]*
                       $
                      /;

问题是是否有一个标准的方式来匹配一个 Raku 模块,或者一个 sub,这样这个正则表达式就不会在未来成为一个错误。

【问题讨论】:

    标签: regex module raku zef


    【解决方案1】:

    如果你使用 Zef::Identity 可能是最好的

    use Zef::Identity;
    
    say Zef::Identity.new( "WithApi:ver<0.0.2>:api<1>" ).hash;
    # {api => 1, auth => , from => Perl6, name => WithApi, ver => 0.0.2}
    
    

    它可能已经安装在您的系统中,因为它是 zef

    【讨论】:

      【解决方案2】:

      查看grammar of Raku,看起来它只是首先在包定义中吃所有副词,然后检查每个副词是verauth还是api, 到 die 如果不是其中之一。

      所以,我会说:不,目前没有标准方法来匹配 Raku 模块名称。

      【讨论】: