Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re^3: caller() mystery

by ikegami (Pope)
on Sep 26, 2008 at 10:23 UTC ( #713847=note: print w/replies, xml ) Need Help??

in reply to Re^2: caller() mystery
in thread caller() mystery

caller(0) returns info about _format_caller's caller.
caller(1) returns info about f's caller
caller(2) would return info about the main program's caller, but that's no longer in Perl. What are you expecting it to return?

Replies are listed 'Best First'.
Re^4: caller() mystery
by rovf (Priest) on Sep 26, 2008 at 10:41 UTC
    Update Please disregard this posting. I finally understood the issue (see id:://713852).
    caller(1) returns info about f's caller

    If this is the case, I would understand why my approach failed. But then I don't understand why in my original program, caller(1) (executed from within _format_caller) delivered

    main,U:\develsv\ARTS\playground\,16,main::f,1,,,,2,UUUUUU +UUUUU
    That is, it says "the caller is main::f". This is _format_caller's caller, NOT f's caller. Actually that's why I had concluded that counting would start at 1. And indeed, from the command line:

    perl -lwe 'sub a{print((caller 0)[3])};sub b{a()};sub c{b()}; c'
    gives main::a (that is, caller 0 says "who I am", i.e. which function is invoking caller).
    perl -lwe 'sub a{print((caller 1)[3])};sub b{a()};sub c{b()}; c'
    gives main::b (that is, caller 1 says who has called me)
    perl -lwe 'sub a{print((caller 2)[3])};sub b{a()};sub c{b()}; c'
    gives main::c (that is, the caller of main::b), but for
    perl -lwe 'sub a{print((caller 3)[3])};sub b{a()};sub c{b()}; c'
    I would have expected to get information about the caller of main::c, which is the main program (not the shell), but there is none.

    Ronald Fischer <>
      that is, caller 0 says "who I am", i.e. which function is invoking caller

      No, you are incorrect.

      caller() doesn't return which 'function' calls you - it returns the package name, the file name and the line number of the caller; which is in the first three arguments. All the other arguments have to do how you are called. So, caller(0)[3] returns how you were called as.

      If you want to find out which function called you (if there is such a function), you call caller(1), which gives you information how your caller is called.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://713847]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (3)
As of 2020-06-07 10:46 GMT
Find Nodes?
    Voting Booth?
    Do you really want to know if there is extraterrestrial life?

    Results (42 votes). Check out past polls.