日向夏特殊応援部隊

俺様向けメモ

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

のように同族のモジュールの入り口がエラーの起因と出ます。
まぁ、これはどういう時に役立つのかなぁ。。。いまいちピンとこないけど、そういう事です。

まとめ

次から使うです。