O'Reilly logo

Perl Cookbook by Nathan Torkington, Tom Christiansen

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Determining Current Function Name

Problem

You want to determine the name of the currently running function. This is useful for creating error messages that don’t need to be changed if you copy and paste the subroutine code.

Solution

Use the caller function:

$this_function = (caller(0))[3];

Discussion

Code can always find the current line number in the special symbol __LINE__ , the current file in __FILE_ _ , and the current package in __PACKAGE__. But there’s no such symbol for the current subroutine name, let alone the name of the one that called this subroutine.

The built-in function caller handles all of these. In scalar context it returns the calling function’s package name. But in list context, it returns a wealth of information. You can also pass it a number indicating how many frames (nested subroutine calls) back you’d like information about: is your own function, 1 is your caller, and so on.

Here’s the full syntax, where $i is how far back you’re interested in:

($package, $filename, $line, $subr, $has_args, $wantarray )= caller($i);
#   0         1         2       3       4          5

Here’s what each of those return values means:

$package

The package that the code was compiled in.

$filename

The name of the file the code was compiled in, reporting -e if launched from the command-line switch of the same name, or - if the script was read from STDIN.

$line

The line number that frame was called from.

$subr

The name of that frame’s function, including its package. Closures return names like main::__ANON__, which are ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required