我已经阅读
perldoc on modules,但我没有看到关于命名一个包的建议,所以它不会与内置或CPAN模块/包名称冲突。
在过去,为了开发本地Session.pm模块,我使用我公司的名称创建了一个本地目录,例如:
package Company::Session;
…和Session.pm将在目录Company /。
但我不是这个命名约定的粉丝。我宁愿命名包层次更接近代码的功能。但是这是怎么做的CPAN一般…
我觉得我缺少一些基本的东西。我也看过Damian的Perl最佳实践,但我可能没有在正确的地方看…
更新w /相关问题:如果有一个包名冲突,Perl如何选择使用哪一个?感谢大家。
解决方法
命名空间Local ::仅为此目的而保留。没有以该前缀开头的模块将被CPAN或核心接受。或者,您可以在顶级名称(如My_Corp :: Session或只是My_Session)中使用下划线。具有下划线的所有类别也已保留。 (这在
perlmodlib中提到,在“选择模块的名称”下)。
请注意,这两个预留仅适用于顶级名称。例如,有名为Time :: Local和Text :: CSV_XS的CPAN模块。但是Local :: Time和Text_CSV :: XS是保留名称,不会在CPAN上被接受。
命名模块后你的公司也很好。 (好吧,除非你为一些真正通用的sounding公司工作。)使用反向域名可能是过分,除非你打算将模块分发给他人。 (但在这种情况下,你应该注册一个正常的模块名称。)
Perl如何解决冲突:
Perl在@INC中搜索具有指定名称的模块的目录。找到的第一个模块是使用的模块。因此,@INC中的目录顺序决定了使用哪个模块(如果你在不同的位置安装了同名的模块)。
perl -V将报告@INC的内容(最高优先级的目录首先列出)。但是在运行时也有很多方法来操作@INC。
BTW,Perl 6将能够handle multiple modules with the same name by different authors,甚至在单个程序中使用多个。但是现在不能解决你的问题。