【发布时间】:2014-11-02 02:40:57
【问题描述】:
我正在使用一个模块,该模块利用一些原型来允许代码块。例如:
sub SomeSub (&) { ... }
由于原型仅在编译时解析时才有效,如果在编译时未解析模块,我想抛出警告甚至致命。例如:
require MyModule; # Prototypes in MyModule won't be parsed correctly
有没有办法检测在 Perl 的编译或运行时/阶段是否正在执行某些东西?
【问题讨论】:
-
这是个坏主意。在运行时加载模块有完全正当的理由——即使是大量使用原型的模块。
-
这可能是一个好主意或坏主意,具体取决于每种情况的原因。如果特定模块的全部目的是创建仅在编译时加载时才有效的功能,那么至少有一个很好的理由警告用户该模块在运行时被无用地加载。
-
不,这仍然是个坏主意。 Perl 不仅有一个编译时/运行时。
use strict具有完全编译时的效果,但我的模块执行sub import { require strict; require Import::Into; strict->import::into(caller) }之类的操作是完全明智的。我的模块在运行时加载strict,但在调用者的编译期间它被导入到调用者的模块中。没错,我的模块的运行时间发生在调用者的编译时间。 -
在运行时加载模块的另一个好理由...我可能不想实际使用您的模块,而只是报告它的版本。
require Your::Module; printf "Your::Module %s installed\n", Your::Module->VERSION;。例如,这可以在设置或诊断脚本中完成,以报告所有应用程序先决条件的已安装版本。 -
如果您在编译时在脚本中调用
use module,“模块”中的所有内容都会在编译时解析,包括您刚刚用作示例的内容。无论如何,这与我提出的场景无关,即确保在全局编译时正确解析原型,因为在那之后,根本就没有办法了。
标签: perl runtime compile-time