Perl

Perlのcaller()の返り値が覚えられないあなたへ

先ほどCPANモジュールをリリースしました。ええ、またとてもニッチです。

Caller::Easy(仮)というモジュールで、(主に私のような)組み込み関数であるcaller()の返り値を覚えられない人が対象です。

CPANgithubへのリンクを貼っておきます。

要約

callerのリストコンテキストの返り値が何番目が何かしょっちゅうわからなくなるのでその度リファレンスをみています。

これをコピペして使う部分だけ使えばいいのかもしれませんが、

( $package, $filename, $line,
    $subroutine, $hasargs, $wantarray, $evaltext, $is_require,
    $hints, $bitmask, $hinthash
) = caller(1);

11個ある返り値のうち使いたい部分だけ切り取ろうとすると、

my $subroutine =( caller(1) )[3];

だとか、可読性の低いコードを書かざるを得ないわけです。
で、保守しようとするとリファレンス見て「あ、これサブルーチンであってるわ」とかになりがち。

そこで、本モジュールはその問題を解決し、下記のような書き方を可能にします。

my $package = caller(1)->package();
my $subroutine = caller(1)->subroutine();

メリット

上記がほぼ全てなんですが、一応実装時に気をつけたこととして、互換性ですかね?
需要があるかどうかはさておき、OOPで通したい(コンストラクタがないと気持ち悪い)人には

my $c = Caller::Easy->new(1);
my $package = $c->package();
my $subroutine = $c->subroutine();

という感じのインターフェースを提供します。

gfxさんが共有されていたイレギュラーな使い方にも対応しまして、特に工夫することなく

my $args = caller(1)->args();

などとして、呼び出し元のサブルーチンの引数を取得できたりします。

デメリット

特にベンチマークとかは撮ってませんが、手っ取り早く書くためにMooseを使ってしまったので重いかもしれません。
でも大丈夫。Mooseを使わずに同様のことができるモジュールが2007年にリリースされてます。
違いは@DB::argsに触れてない点くらいじゃないですかね?

え?なんで車輪の再発明しちゃったの?って?

調べるよりも書くほうが早かったからです。

githubレポジトリがないし、久しくメンテされていないようなので、新しく作っても差し支えないと判断しました。

名前募集中

構想段階でつけた仮称のまま、良い名前が思いつかなくてそのままリリースしちゃいました。