我正在阅读O’Reilly的Perl Objects,References&模块,更具体地说是关于模块的部分.它声明当使用Some :: Module时,您可以指定导入列表.从它的解释看来,使用这个列表的唯一好处是为了保持命名空间的清洁.换句话说,如果主程序包中有子程序some_sub,并且加载的模块有一个同名的子程序,则子程序将被覆盖.但是,如果您指定导入列表并从此列表中省略some_sub,则不会发生此冲突.然后你可以通过声明它来运行模块中的some_sub:Some :: Module :: some_sub.
除了上面描述的那个之外还有其他好处吗?我问这个是因为在某些情况下你加载了具有大量功能的模块,即使你只对它的一些方法感兴趣.起初我认为通过指定一个导入列表,你只加载那些方法,而不是用你不会使用的方法来膨胀内存.但是,从上面的解释看来并非如此.您是否可以通过仅加载模块的部分来有选择地节省资源?或者Perl是否足够智能,在编译时无需程序员干预?
解决方法
请注意,“导入列表”只是一种约定.模块的导入功能可以随意使用此列表执行任何操作,您可以看到它(ab)被许多所谓的pragma模块使用.因此,部分加载不一定以任何方式使用.例如,模块可以加载重要的函数存根,无论您是否导入它们,并在实际的第一次调用时动态加载大量实现.
因此,使用部分导入列表可能,或者实际上可能不会保存任何资源 – 这完全取决于所使用模块的实际实现.
虽然require和use确实加载了整个.pm文件 – 该文件可能只是一个轻量级的存根和加载器,用于位于其他地方的实际代码.还有一个惯例是调用那些模块::Heavy
.
模块可以自由地以任何方式实现部分加载.以下是模块如何节省资源的一些可能性:
> AUTOLOAD(带有免费的AutoLoader,AutoSplit和SelfLoader模块).
>使用加载必要子模块的存根.
>首次按名称访问繁重数据(即字典或编码映射)时,动态加载它们.
>如果依赖于其他重型模块,则在运行时动态地要求它们依赖于它们而不是一开始就使用编译时.
此列表中的所有内容都可以在幕后自动运行,通过使用导入列表公开,或以其他完全任意的方式工作/调用.再一次,它完全取决于模块的实现.