Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re^2: caller() mystery

by rovf (Priest)
on Sep 26, 2008 at 10:11 UTC ( #713844=note: print w/replies, xml ) Need Help??


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

There's only two levels of caller in this case.

Hmmm.... I was counting 3:

  • Level 0: _format_caller
  • Level 1: main::f
  • Level 2: The main program itself

It seems that the top-level program is not represented by a stack frame...
-- 
Ronald Fischer <ynnor@mm.st>

Replies are listed 'Best First'.
Re^3: caller() mystery
by ikegami (Pope) on Sep 26, 2008 at 10:23 UTC

    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?

      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>
        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?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (5)
As of 2020-05-28 22:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (166 votes). Check out past polls.

    Notices?