1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

先ほど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レポジトリがないし、久しくメンテされていないようなので、新しく作っても差し支えないと判断しました。

名前募集中

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?