perl 解譯器的當前階段。
可能的值為
PerlInterpreter*
正在透過 perl_construct
建構。此值大部分是為了完整性,並透過底層 C 變數 PL_phase
使用。除非解譯器的建構已完成,否則 Perl 程式碼實際上不可能執行。
這是全域編譯時間。基本上包含每個 BEGIN
區塊,在頂層程式的編譯時間中直接或間接執行。
此階段未稱為「BEGIN」,以避免與 BEGIN
區塊混淆,因為這些區塊在任何編譯單元的編譯時間執行,而不仅仅是頂層程式。在執行時輸入新的、本地的編譯時間,例如透過 eval "use SomeModule"
建構,不是全域解譯器階段,因此不會反映在 ${^GLOBAL_PHASE}
中。
執行任何 CHECK
區塊。
類似於「CHECK」,但用於 INIT
區塊,而非 CHECK
區塊。
主要的執行時間,即執行 PL_main_root
。
執行任何 END
區塊。
全域毀損。
另請注意,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 中新增。