【发布时间】:2015-08-04 21:26:54
【问题描述】:
在我正在编写的脚本中,我有类似以下内容:
require "environment.pm"; # Various definitions, including subroutine get_coll()
use Custom::Module;
在Custom::Module文件中,我以
package Custom::Module;
并以
结尾1;
当我尝试拨打 get_coll() 时,我收到一个错误:
( main::get_coll() ) 未定义。
如果我需要 Custom::Module 而不是使用或更改调用是
Custom::Module::get_coll();
它工作正常。这使我相信CustomModule 的“使用”语句正在更改“活动”命名空间,因此当处理get_coll() 时(因为它是在调用时处理的)它被分配给该命名空间而不是主命名空间.这似乎不是常规 perl 模块的问题,但从我浏览过的模块来看,我没有注意到任何不同之处会导致命名空间在模块加载后“恢复”回 main。任何有助于更好地理解命名空间使用或修复模块以免导致此问题的帮助将不胜感激。
旁注:对我来说,仅仅“要求”该模块并不是一个大问题,但这对我来说是出乎意料的行为,所以我主要只是想更好地理解为什么会发生这种情况。
【问题讨论】:
-
是
package这样做的,而不是use。这就是package的全部意义所在。 -
我认为你错了。如果你仔细测试你会发现,如果
use Custom::Module不允许你直接调用get_coll,那么require Custom::Module也不能。如果您使用Exporter和use Custom::Module正确实现Custom::Module,那么它将将该符号导入调用代码的命名空间。否则,您必须将其完全限定为Custom::Module::get_coll
标签: perl module namespaces