【发布时间】:2020-03-25 05:17:13
【问题描述】:
Having just figured out this,我想知道-M 将如何处理附加到包名称的终端::,
$ perl -MFoo:: -e1
我得到的是……
在
@INC中找不到Foo/.pm(您可能需要安装Foo::模块)(@INC包含:[...])。
这似乎表明它不起作用,所以好奇心迫使我......
$ mkdir Foo;
$ echo "package Foo { sub k { die 42 } }; 1;" > Foo/.pm
$ PERL5LIB=. perl -MFoo:: -e'Foo::->k'
这确实有效。是否支持 use mod::; 解析为 mod/.pm 的约定?这是从古代遗留下来的。这种行为是从哪里来的?
有了这个架构我可以做到,
Foo/.pm # package Foo
Foo/Bar/.pm # package Foo::Bar
Foo/Bar/Baz/.pm # package Foo::Bar::Baz;
那我就可以了
use Foo::; # resolves to Foo/.pm
use Foo::Bar::; # resolves to Foo/Bar/.pm
use Foo::Bar::Baz::; # resolves to Foo/Bar/Baz/.pm
Foo::->new;
Foo::Bar::->new;
Foo::Bar::Baz::->new;
我喜欢这个,因为这增加了
的好处- 让我的所有课程都变成空话。
- 在
use和调用之间添加一致性。
这个设计是有意的吗?它在任何地方都有记录吗?以前有没有人想过这个很棒的主意?
【问题讨论】:
-
我想念这比不使用尾随 :: 使您的课程裸词和
use和调用之间的一致性更好。而且我希望如果 P5P 觉得这令人困惑并去除了尾部斜线,他们会毫不犹豫地删除它,尽管我怀疑是否会有任何动力对此采取任何行动。 -
我在顶部有一个链接。本质上,如果您有一个名为
Foo::Bar的包并且您使用Foo::Bar->new调用,那么如果您有一个package Foo { sub Bar { "Baz" } },您实际上是在执行( Foo::Bar() )->new,即"Baz"->new。所以你可以做Foo::Bar::->new来解决这个问题,但是你的use导入是不同的。有趣的是,您也可以安装use Foo::Bar::来工作。那么你的use和你对包的引用是一样的。use Foo::Bar::; Foo::Bar::->new
标签: perl import module require