如何规范地解析模块名称

Posted

技术标签:

【中文标题】如何规范地解析模块名称【英文标题】: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,这样这个正则表达式就不会在未来成为一个错误。

【问题讨论】:

【参考方案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 模块名称。

【讨论】:

以上是关于如何规范地解析模块名称的主要内容,如果未能解决你的问题,请参考以下文章

修改 __main__ 模块的属性访问(名称解析的细节)

Part5-1-2 Nodejs 核心模块

Python命名规范

如何解析文本文件并使用构造函数中的文件输入来创建对象容器

Zeroconf 名称解析

java web项目中,模块的命名规则是啥?