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

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\callertest.pl,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 <ynnor@mm.st>

Replies are listed 'Best First'.
Re^5: caller() mystery
by JavaFan (Canon) on Sep 26, 2008 at 10:55 UTC
    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.