=over

=item ${^GLOBAL_PHASE}
X<${^GLOBAL_PHASE}>

The current phase of the perl interpreter.

Possible values are:

=over 8

=item CONSTRUCT

The C<PerlInterpreter*> is being constructed via C<perl_construct>.  This
value is mostly there for completeness and for use via the
underlying C variable C<PL_phase>.  It's not really possible for Perl
code to be executed unless construction of the interpreter is
finished.

=item START

This is the global compile-time.  That includes, basically, every
C<BEGIN> block executed directly or indirectly from during the
compile-time of the top-level program.

This phase is not called "BEGIN" to avoid confusion with
C<BEGIN>-blocks, as those are executed during compile-time of any
compilation unit, not just the top-level program.  A new, localised
compile-time entered at run-time, for example by constructs as
C<eval "use SomeModule"> are not global interpreter phases, and
therefore aren't reflected by C<${^GLOBAL_PHASE}>.

=item CHECK

Execution of any C<CHECK> blocks.

=item INIT

Similar to "CHECK", but for C<INIT>-blocks, not C<CHECK> blocks.

=item RUN

The main run-time, i.e. the execution of C<PL_main_root>.

=item END

Execution of any C<END> blocks.

=item DESTRUCT

Global destruction.

=back

Also note that there's no value for UNITCHECK-blocks.  That's because
those are run for each compilation unit individually, and therefore is
not a global interpreter phase.

Not every program has to go through each of the possible phases, but
transition from one phase to another can only happen in the order
described in the above list.

An example of all of the phases Perl code can see:

    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"
    );

This will print out

    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

This variable was added in Perl 5.14.0.

=back