package junk; sub BEGIN { printf "Hi from %s BEGIN\n", __PACKAGE__ } sub CHECK { printf "Hi from %s CHECK\n", __PACKAGE__ } sub INIT { printf "Hi from %s INIT\n", __PACKAGE__ } sub END { printf "Hi from %s END\n", __PACKAGE__ } 1; #### #! perl -slw use strict; print "Main runtime: About to eval use junk"; ; eval "use junk"; print "Main runtime: Just eval'd use junk"; ; #### C:\test>junk Main runtime: About to eval use junk Hi from junk BEGIN Too late to run CHECK block at junk.pm line 4, line 1. Too late to run INIT block at junk.pm line 5, line 1. Main runtime: Just eval'd use junk Hi from junk END #### package junk; use Attribute::Handlers; no warnings 'redefine'; sub TRACE : ATTR(CODE,BEGIN) { my ($pkg, $sym, $ref, $attr, $data, $phase, $file, $line) = @_; *{ $sym } = sub { warn "$file($line) called with [@_]\n"; my( @rc )= &$ref; warn "$file($line): returning [ @rc ]\n"; } } sub doStuff :TRACE { print "junk::doStuff says hi"; } 1; #### #! perl -slw use strict; print "Main runtime: About to eval use junk"; ; eval "use junk"; print "Main runtime: Just eval'd use junk; calling doStuff()"; ; junk::doStuff( 1..10 ); #### C:\test>junk Main runtime: About to eval use junk Main runtime: Just eval'd use junk; calling doStuff() junk.pm(16) called with [1 2 3 4 5 6 7 8 9 10] junk::doStuff says hi junk.pm(16): returning [ 1 ]