in reply to Replacing warn/die with carp/croak?

What are you talking about? croak and carp don't create a stack trace.

>type script.pl use M1 qw( ); sub test2 { M1::test3(); } sub test1 { test2(); } test1(); >type M1.pm package M1; use M2 qw( ); sub test4 { M2::test5(); } sub test3 { test4(); } 1; >type M2.pm package M2; use Carp qw( croak ); sub test5 { croak("ribbit"); } 1; >perl script.pl ribbit at M1.pm line 3

Although you can force them to produce a stack trace.

>perl -MCarp=verbose script.pl ribbit at M2.pm line 3 M2::test5() called at M1.pm line 3 M1::test4() called at M1.pm line 4 M1::test3() called at script.pl line 2 main::test2() called at script.pl line 3 main::test1() called at script.pl line 4

If there's a reason against using carp and croak, it's that they hide the true source of the error in an attempt to tidily show the actual source of the error. When that's not good, the person debugging the problem can turn on verbose mode and get the information he needs.