If you've ever used eval, or any modules, chances are you've had an error like this:
Use of uninitialized value in string eq at (eval 469) line 3.
It's telling you that somewhere on the 3rd line of the code passed to the 469th call to eval, you're using an undefined value. That's not very fun! Who knows where eval was called the 469th time? You could walk through your program and try to keep track of every time eval was called, but that's not very fun. So what to do?

Turn your warning handler into something more descriptive. At the top of your code, do this:

use Carp; $SIG{__WARN__} = \&carp; $SIG{__DIE__} = \&confess;
carp and confess are equivalent to warn and die, respectively, except that they print a stack trace as well as the error message. Now, rerun your code and get
Use of uninitialized value in string eq at (eval 469) line 3. at /home/alester/Lib/TW/CP.pm line 116
No counting of eval calls required!

Replies are listed 'Best First'.
Re: HOWTO: Finding errors "at (eval 469) line 3"
by tilly (Archbishop) on Apr 03, 2004 at 02:48 UTC
      With this solution you don't need to add anything before each eval, but only once at the beginning of the program. I think it is much better.
        Each method has its strengths. The warning handler takes less work to do. But will break if anyone else decides to create a warning handler. And it doesn't help if you trying to trace what happened through 3 eval statements in a long stack backtrace. (Most of my errors already use Carp::confess, so petdance's proposal doesn't add anything that I already usually have.)

        The alternative that I suggested takes more work, but adds context to the error message. Furthermore it isn't any more work than you have to do already just to undo the fact that eval traps errors.

        I find my alternative particularly useful when the eval constructed a function that is being called dynamically later. (Like the example that I pointed at in my code.) In that case a stack backtrace only tells you that method X was called somewhere, and that method X was generated in some eval, in some class. Quick, which class was it produced in, and find me the code that produced it!

Re: HOWTO: Finding errors "at (eval 469) line 3"
by ysth (Canon) on Apr 04, 2004 at 13:18 UTC
    I think you are thinking of cluck, not carp.