autouse - 延迟加载模块,直到函数被使用
use autouse 'Carp' => qw(carp croak);
carp "this carp was predeclared and autoused ";
如果模块 Module
已经加载,那么声明
use autouse 'Module' => qw(func1 func2($;$));
等同于
use Module qw(func1 func2);
如果 Module
定义了带有原型 ($;$)
的 func2(),并且 func1() 没有原型。 (至少如果 Module
使用了 Exporter
的 import
,否则将是致命错误。)
如果模块 Module
尚未加载,那么上述声明将在当前包中声明函数 func1() 和 func2()。 当这些函数被调用时,它们将根据需要加载包 Module
,并将自身替换为正确的定义。
使用 autouse
将把程序执行的重要步骤从编译时移动到运行时。 这可能
如果 autouse
的模块有一些初始化操作,而它期望这些操作在早期完成,那么这可能会中断程序的执行。
由于重要的检查(例如原型正确性)从编译时移到了运行时,因此您的代码中可能会隐藏错误。特别是,如果您在 autouse
行上指定的原型错误,您将无法在执行相应函数之前发现它。对于并非总是被调用的函数来说,这将非常不幸(请注意,对于此类函数,autouse
会带来最大的收益,有关解决方法,请参见下文)。
为了缓解第二个问题(部分),建议您像这样编写脚本
use Module;
use autouse Module => qw(carp($) croak(&$));
carp "this carp was predeclared and autoused ";
第一行确保您的参数规范中的错误能够尽早发现。当您发布应用程序时,您应该注释掉第一行,因为它会使第二行变得无用。
Ilya Zakharevich ([email protected])
perl(1)。