在 Perl 中检测编译阶段

Fra*_*ozo 4 perl runtime compile-time

我正在使用一个模块,该模块利用一些原型来允许代码块。例如:

sub SomeSub (&) { ... }
Run Code Online (Sandbox Code Playgroud)

由于原型仅在编译时解析时才有效,如果模块在编译时未解析,我想抛出警告甚至致命。例如:

require MyModule; # Prototypes in MyModule won't be parsed correctly
Run Code Online (Sandbox Code Playgroud)

有没有办法检测某些东西是否在 Perl 的编译或运行时/阶段被执行?

fri*_*edo 5

如果您在 Perl 5.14 或更高版本上运行,则可以使用${^GLOBAL_PHASE}包含当前编译器状态的特殊变量。这是一个例子。

use strict;
use warnings;

sub foo {
    if ( ${^GLOBAL_PHASE} eq 'START' ) {
        print "all's good\n";
    } else {
        print "not in compile-time!\n";
    }
}

BEGIN {
    foo();
};

foo();
Run Code Online (Sandbox Code Playgroud)

输出:

all's good
not in compile-time!
Run Code Online (Sandbox Code Playgroud)

  • @FranciscoZarabozo 您可以尝试使用 `INIT {}` 块。它应该只在模块在 BEGIN 中加载时起作用(例如使用 `use`)。 (2认同)