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
evaluated, 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, ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access