Acme-AllThePerlIsAStage
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Acme/AllThePerlIsAStage.pm view on Meta::CPAN
our $our_set_at_unitcheck;
our $our_set_at_check;
our $our_set_at_init;
our $our_set_at_end;
our $our_set_at_init_and_run;
sub import {
_say_stage("inside import()");
}
# Since we are doing BEGIN blocks that call this we need it first:
sub _say_stage {
my ($name) = @_;
print caller() . " - $name (\${^GLOBAL_PHASE} is '${^GLOBAL_PHASE}')\n";
return unless $ENV{'AllThePerlIsAStage_verbose'};
# TODO v0.02: test that this does not change results
# TODO v0.02: eval if callable w/and w/out parens?
# print "\t set_at_begin() is " . (defined &set_at_begin) ? "defined" : "not defined";
# print "\tset_at_global() is " . (defined &set_at_global) ? "defined" : "not defined";
# set_at_begin_via_import
# set_at_begin_via_block
# set_at_begin_via_sub_defined_at_global
# set_at_begin_via_sub_defined_at_global
# set_at_begin
# set_at_global
for my $var (
qw(
my_set_at_global my_set_at_run my_set_at_begin my_set_at_unitcheck my_set_at_check my_set_at_init my_set_at_end my_set_at_init_and_run
our_set_at_global our_set_at_run our_set_at_begin our_set_at_unitcheck our_set_at_check our_set_at_init our_set_at_end our_set_at_init_and_run
)
) {
no strict 'refs'; ## no critic
my $val = defined ${$var} ? "'${$var}'" : 'undef() (i.e. not initialized at this point)';
my $spacing = " " x ( 22 - length($var) );
print "\t\$$var$spacing is $val\n";
}
print "\n";
}
#### now the meat and potatoes ##
_say_stage("Global Scope 1");
if ( ${^GLOBAL_PHASE} eq 'RUN' ) {
$my_set_at_run = $$;
$our_set_at_run = $$;
$my_set_at_init_and_run = $$;
$our_set_at_init_and_run = $$;
_say_stage("IF-RUN 1");
}
BEGIN {
$my_set_at_begin = $$;
$our_set_at_begin = $$;
_say_stage("BEGIN 1");
}
UNITCHECK {
$my_set_at_unitcheck = $$;
$our_set_at_unitcheck = $$;
_say_stage("UNITCHECK 1");
}
CHECK {
$my_set_at_check = $$;
$our_set_at_check = $$;
_say_stage("CHECK 1");
}
INIT {
$my_set_at_init = $$;
$our_set_at_init = $$;
$my_set_at_init_and_run = $$;
$our_set_at_init_and_run = $$;
_say_stage("INIT 1");
}
END {
$my_set_at_end = $$;
$our_set_at_end = $$;
_say_stage("END 1");
}
END {
_say_stage("END 2");
}
INIT {
_say_stage("INIT 2");
}
CHECK {
_say_stage("CHECK 2");
}
UNITCHECK {
_say_stage("UNITCHECK 2");
}
BEGIN {
_say_stage("BEGIN 2");
}
if ( ${^GLOBAL_PHASE} eq 'RUN' ) {
_say_stage("IF-RUN 2");
}
_say_stage("Global Scope 2");
1;
__END__
=encoding utf-8
=head1 NAME
Acme::AllThePerlIsAStage - Grok perl stages for scripts and modules under use and requireâuncompiled and compiled
=head1 VERSION
This document describes Acme::AllThePerlIsAStage version 0.01
=head1 SYNOPSIS
Compare output points to see what-happens-when in order to understand why and decide on what to do:
perl -e 'use Acme::AllThePerlIsAStage;'
perl -e 'use Acme::AllThePerlIsAStage;'
perlcc -e 'use Acme::AllThePerlIsAStage;' -o tmp/use
./tmp/use
./tmp/use
perl -e 'use Acme::AllThePerlIsAStage ();'
perl -e 'use Acme::AllThePerlIsAStage ();'
perlcc -e 'use Acme::AllThePerlIsAStage;' -o tmp/use_no_import
./tmp/use_no_import
./tmp/use_no_import
perl -e 'require Acme::AllThePerlIsAStage;'
perl -e 'require Acme::AllThePerlIsAStage;'
perlcc -e 'require Acme::AllThePerlIsAStage;' -o tmp/req
./tmp/req
./tmp/req
=head1 DESCRIPTION
Sometimes the stages involved in perlâs execution can be hard to grasp. It gets even hairier when you start compiling your code.
When trying to explain and then demonstrate what was happening I found myself writing scripts and modules to output what perl is doing where in order to find out if my understanding lined up with reality. Then to see how reality held up once compiled...
Finally, making a set up every few months got old and I thought Iâd put it all on CPAN for the masses to enjoy/ignore.
=head1 TL;DR
Too Long; Didnât Run
TODO v0.02 â fill me out (sorry, ran our of time)
=head2 stage info
TODO v0.02 â fill me out (sorry, ran our of time)
=head2 subroutine info
TODO v0.02 â fill me out (sorry, ran our of time)
=head2 our $vars
TODO v0.02 â fill me out (sorry, ran our of time)
=head2 my $vars
TODO v0.02 â fill me out (sorry, ran our of time)
=head1 INTERFACE
Just use or require the module. It outputs info you can use to visualize and study in order to grok L<perlmod/"BEGIN, UNITCHECK, CHECK, INIT and END">.
If the environment variable 'AllThePerlIsAStage_verbose' is true it outputs info on various symbols at each point in the process.
=head2 use()/require() compiled/uncompiled
perl -e 'use Acme::AllThePerlIsAStage;'
perl -e 'use Acme::AllThePerlIsAStage;'
perlcc -e 'use Acme::AllThePerlIsAStage;' -o tmp/use
./tmp/use
./tmp/use
perl -e 'use Acme::AllThePerlIsAStage ();'
perl -e 'use Acme::AllThePerlIsAStage ();'
perlcc -e 'use Acme::AllThePerlIsAStage;' -o tmp/use_no_import
./tmp/use_no_import
./tmp/use_no_import
perl -e 'require Acme::AllThePerlIsAStage;'
perl -e 'require Acme::AllThePerlIsAStage;'
perlcc -e 'require Acme::AllThePerlIsAStage;' -o tmp/req
./tmp/req
./tmp/req
more verbose:
AllThePerlIsAStage_verbose=1 perl -e 'use Acme::AllThePerlIsAStage;'
AllThePerlIsAStage_verbose=1 perl -e 'use Acme::AllThePerlIsAStage;'
perlcc -e 'use Acme::AllThePerlIsAStage;' -o tmp/use
AllThePerlIsAStage_verbose=1 ./tmp/use
AllThePerlIsAStage_verbose=1 ./tmp/use
AllThePerlIsAStage_verbose=1 perl -e 'use Acme::AllThePerlIsAStage ();'
AllThePerlIsAStage_verbose=1 perl -e 'use Acme::AllThePerlIsAStage ();'
perlcc -e 'use Acme::AllThePerlIsAStage;' -o tmp/use_no_import
AllThePerlIsAStage_verbose=1 ./tmp/use_no_import
AllThePerlIsAStage_verbose=1 ./tmp/use_no_import
AllThePerlIsAStage_verbose=1 perl -e 'require Acme::AllThePerlIsAStage;'
AllThePerlIsAStage_verbose=1 perl -e 'require Acme::AllThePerlIsAStage;'
perlcc -e 'require Acme::AllThePerlIsAStage;' -o tmp/req
AllThePerlIsAStage_verbose=1 ./tmp/req
AllThePerlIsAStage_verbose=1 ./tmp/req
=head2 from a script point of view
There are script's in the moduleâs share/ dir (not installed on your system but they are there if you want them).
To see what it looks like when use()d from a script, compare:
./and_one_man_in_his_time_plays_many_parts.pl
./and_one_man_in_his_time_plays_many_parts.pl
perlcc ./and_one_man_in_his_time_plays_many_parts.pl -o and_one_man_in_his_time_plays_many_parts
./and_one_man_in_his_time_plays_many_parts
./and_one_man_in_his_time_plays_many_parts
more verbose:
AllThePerlIsAStage_verbose=1 ./and_one_man_in_his_time_plays_many_parts.pl
AllThePerlIsAStage_verbose=1 ./and_one_man_in_his_time_plays_many_parts.pl
AllThePerlIsAStage_verbose=1 perlcc ./and_one_man_in_his_time_plays_many_parts.pl -o and_one_man_in_his_time_plays_many_parts
AllThePerlIsAStage_verbose=1 ./and_one_man_in_his_time_plays_many_parts
AllThePerlIsAStage_verbose=1 ./and_one_man_in_his_time_plays_many_parts
To see what it looks like when require()d from a script, compare:
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.994 second using v1.00-cache-2.02-grep-82fe00e-cpan-c30982ac1bc3 )