Determining the Caller’s Package
Problem
You need to find out the current or calling package.
Solution
To find the current package:
$this_pack = __PACKAGE__;
To find the caller’s package:
$that_pack = caller();
Discussion
The __PACKAGE__
symbol returns the package that
the code is currently being compiled into. This doesn’t
interpolate into double-quoted strings:
print "I am in package __PACKAGE__\n"; # WRONG!
I am in package __PACKAGE__
Needing to figure out the caller’s package arose more often in
older code that received as input a string of code to be
eval
uated, or a filehandle, format, or directory
handle name. Consider a call to a hypothetical
runit
function:
package Alpha; runit('$line = <TEMP>'); package Beta; sub runit { my $codestr = shift; eval $codestr; die if $@; }
Because runit
was compiled in a different package
than was currently executing, when the eval
runs,
it will act as though it were passed $Beta::line
and Beta::TEMP
. The old workaround was to include
your caller’s package first:
package Beta; sub runit { my $codestr = shift; my $hispack = caller; eval "package $hispack; $codestr"; die if $@; }
That approach only works when $line
is a global
variable. If it’s lexical, that won’t help at all.
Instead, arrange for runit
to accept a reference
to a subroutine:
package Alpha; runit( sub { $line = <TEMP> } ); package Beta; sub runit { my $coderef = shift; &$coderef(); }
This not only works with lexicals, it has the added benefit of checking the code’s syntax at compile time, ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.