但し Carp の場合は cluck や confess を明示的に使うよりも、
$ perl -MCarp=verbose target.pl
という使い方でも stacktrace を得ることが出来ます。Carp::Clan の場合は、
use Carp::Clan;
$Carp::Clan::Verbose = 1 if $ENV{DEBUG};
のようなフラグで判別すると良いでしょう。
Carp::Clan の場合ですと、デフォルトでメッセージとファイル名、行番号だけで無く、どの package のどのサブルーチン内でエラーが起きたかも分かります。
$ perl carp.pl
warning message!!! at carp.pl line 17
$ perl carp_clan.pl
NS::A::do_a(): warning message!!! at carp_clan.pl line 19
という具合です。具体的なコードでは、
#!/usr/bin/perl
use strict;
use warnings;
package NS::A;
use Carp::Clan;
$Carp::Clan::Verbose = 1 if $ENV{DEBUG};
sub do_a {
croak('warning message!!!');
}
package NS::B;
sub do_b {
NS::A::do_a();
}
package NS::C;
sub do_c {
NS::B::do_b();
}
package main;
NS::C::do_c();
のような形になります。またエラーハンドリングの package 名に対する正規表現によるグルーピングもできます。詳しくは perldoc Carp::Clan を見て下さい。
次は id:kazuhooku さん。