Perl - How to Find Out Who You Are and Who Your Caller Is
How to find out the name of the current method, and the name of your parent.
[Doc 8300 content is unavailable at this time.]
The caller
function provides access to the call stack in Perl. In a list context, it returns your package information:
( $package, $filename, $line ) = caller;
Which is not very useful. Luckily, if you give it a parameter (the stack frame number in question), it returns:
( $package, $filename, $line, $subroutine, $hasargs, $wantarray, $evaltext, $is_require, $hints, $bitmask ) = caller($i);
So, you can use it to find out who you are, or who your parent is (I'll leave finding your grandparent as an exercise to the reader):
# Me $me = ( caller(0) )[3]; # Parent $parent = ( caller(1) )[3];
Rather than using caller()
directly, you probably want to create functions:
sub whoami { ( caller(1) )[3] } sub whowasi { ( caller(2) )[3] }
A full example program:
# ignore warnings about undefs. DON'T DO THIS IN REAL CODE no warnings; sub whoami { ( caller(1) )[3] } sub whowasi { ( caller(2) )[3] } sub me { print "me: hello\n"; # Note that whowasi() returns undef here printf "I Am: %s. I was: %s\n", whoami(), whowasi(); print "me: goodbye\n"; } sub them { print "them: hello\n"; printf "I Am: %s. I was: %s\n", whoami(), whowasi(); me(); print "them: goodbye\n"; } print "main: hello\n"; # Note that whoami() and whowasi() return undef here printf "I Am: %s. I was: %s\n", whoami(), whowasi(); them(); print "main: goodbye\n";
Which Produces:
$ perl ./demo.pl main: hello I Am: . I was: them: hello I Am: main::them. I was: me: hello I Am: main::me. I was: main::them me: goodbye them: goodbye main: goodbye