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, ...

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.