${^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 中新增。