Carp::Clanのメリット
すみません、今までずっと知りませんでした。orz...
前々から人のソースに良く出て来るのでなんでかなーと思ったんですけども、ふと気になって調べてみました。
carp, croakの違い
論より証拠
#!/usr/bin/perl use strict; use warnings; package Pack::C; use Carp; sub foo { carp("test"); } package Class::B; sub foo { Pack::C::foo; } package Pack::A; sub foo { Class::B::foo(); } package main; Pack::A::foo();
と、このソースのuse Carpをuse Carp::Clanに変更した物で実行結果が異なります。
use Carp
test at carp.pl line 17
use Carp::Clan
Pack::C::foo(): test at carp.pl line 17
verboseオプション
さっきのソースにuse Carp::Clan qw(verbose)を加えると、
Carp::Clan::__ANON__(): test at carp.pl line 11 Pack::C::foo() called at carp.pl line 17 Class::B::foo() called at carp.pl line 23 Pack::A::foo() called at carp.pl line 28
となります。いわゆるCarpにおけるconfessと同等の結果が返って来ます。いいですねぇ。
モジュールのグルーピング
さらに、正規表現によって同族のモジュールのグルーピングが出来るみたいですね。
#!/usr/bin/perl use strict; use warnings; package Pack::C; use Carp::Clan; sub foo { croak("foo"); } package Pack::B; use Carp::Clan; sub foo { Pack::C::foo(); } package Pack::A; use Carp::Clan; sub foo { Pack::B::foo(); } package main; Pack::A::foo();
に対して、use Carp::Clanをuse Carp::Clan qw(^Pack::)と変えた場合、
use Carp::Clan
Pack::C::foo(): foo at carp.pl line 19
エラーの起こった原因箇所はCarpと同じ場所を指すんだけど、
use Carp::Clan qw(^Pack::A)
Pack::A::foo(): foo at carp.pl line 32
のように同族のモジュールの入り口がエラーの起因と出ます。
まぁ、これはどういう時に役立つのかなぁ。。。いまいちピンとこないけど、そういう事です。
まとめ
次から使うです。