${^GLOBAL_PHASE}

perl 解释器的当前阶段。

可能的值为

CONSTRUCT

PerlInterpreter* 正通过 perl_construct 进行构建。此值主要用于完整性,并通过底层 C 变量 PL_phase 使用。除非解释器的构建完成,否则 Perl 代码实际上不可能执行。

START

这是全局编译时。基本上包括在顶级程序的编译时直接或间接执行的每个 BEGIN 块。

此阶段不称为“BEGIN”,以避免与 BEGIN 块混淆,因为这些块在任何编译单元的编译时执行,而不仅仅是顶级程序。在运行时输入的新的、本地化的编译时,例如通过 eval "use SomeModule" 等构造,不是全局解释器阶段,因此不会反映在 ${^GLOBAL_PHASE} 中。

CHECK

执行任何 CHECK 块。

INIT

与“CHECK”类似,但适用于 INIT 块,而不是 CHECK 块。

RUN

主运行时,即执行PL_main_root

END

执行任何END块。

DESTRUCT

全局销毁。

另请注意,UNITCHECK 块没有值。这是因为它们针对每个编译单元单独运行,因此不是全局解释器阶段。

并非每个程序都必须经历每个可能的阶段,但从一个阶段到另一个阶段的转换只能按照上述列表中描述的顺序进行。

Perl 代码可以看到的所有阶段的示例

BEGIN { print "compile-time: ${^GLOBAL_PHASE}\n" }

INIT  { print "init-time: ${^GLOBAL_PHASE}\n" }

CHECK { print "check-time: ${^GLOBAL_PHASE}\n" }

{
    package Print::Phase;

    sub new {
        my ($class, $time) = @_;
        return bless \$time, $class;
    }

    sub DESTROY {
        my $self = shift;
        print "$$self: ${^GLOBAL_PHASE}\n";
    }
}

print "run-time: ${^GLOBAL_PHASE}\n";

my $runtime = Print::Phase->new(
    "lexical variables are garbage collected before END"
);

END   { print "end-time: ${^GLOBAL_PHASE}\n" }

our $destruct = Print::Phase->new(
    "package variables are garbage collected after END"
);

这将打印

compile-time: START
check-time: CHECK
init-time: INIT
run-time: RUN
lexical variables are garbage collected before END: RUN
end-time: END
package variables are garbage collected after END: DESTRUCT

此变量在 Perl 5.14.0 中添加。