Perlでデバッグ目的でインスタンスの持つメソッドを出力してみた

phpではvar_dump()という便利な関数があって、コードの気になる箇所で、気になる変数の中を見ることが出来ます。文字列はもちろん、配列やオブジェクトといった構造も、その構造の通りに見やすい形で出してくれます。あんまり頼りすぎると、var_dump()を書いてはリロードというのを繰り返す、あまり効率のよくない作業になっちゃうけど、さっと使えて見やすくてわかりやすいのは、はまった時にはとても助かります。

じゃぁ最近入門したPerlはというと、phpと違って組み込み関数もかなり少ない言語なので、ダンプはモジュールによって提供されています。なのでいくつかの方法があるみたいです。よく見かけるのはData::DumperとかSmart::Commentsとかでしょうか。ただ、なんというか、あんまり見やすくないです。phpvar_dump()に慣れすぎたせいかもしれませんが、var_dump()の多次元配列でもオブジェクトでもきれいに構造を出してくれるので、phpを離れてみて使いやすさを認識出来たような気がします。

ともあれ、はまっている時に、コードの動きを把握するためのダンプ出力にいまいち馴染めず、四苦八苦していたわけです。特にO/RマッパーのDBIx::ClassのResultSetがちゃんと取れてるかどうかは、ダンプして確認するのはちょっと厳しい感じです。大量のダンプが出てくるので、正直よく分かりませんし、構造の出し方もちょっと分かりにくいというかなんというか・・・。それで、オブジェクトが持つメソッドを確認することで、オブジェクトがDBIx::Class::ResultSetかどうかを確認しようと思ったんですが、Perl暦も浅いので方法が分からず、Twitterでつぶやいてたら教えてもらえました。*1

オブジェクトの持つメソッドをダンプする

use Data::Dumper;
use Class::Inspector;
use Scalar::Util qw/blessed/;

この3つのモジュールを使います。

my $debug = Class::Inspector->methods(blessed $instance, 'full');
warn Dumper $debug;

これで$instanceの持つメソッドをずらーっとダンプできます。

解説

blessed $instanceインスタンスからパッケージ名が取得できます。

Class::Inspector->methods()で、クラスの持つメソッドを取得できます。ただ、引数が文字列でクラス名なので、インスタンスを直接わたすってのが出来ません。なのでblessedでまずクラス名を取るというわけです。

phpvar_dump()も、メソッドの一覧はダンプしてくれません。メソッドの出力に関しては、Perlのほうが簡単かもしれない。

なんか

眠い目を擦りながら書いてたら、前置きが長い無駄なエントリーになっちゃった。できれば推敲とかしてもっと短くまとめたいけど、時間もないのでこのままで。

環境

Perl 5.8.8

*1:つぶやきへのURLと引用を貼ろうかと思ってたけど、今確認したらprotectedなのでやめときます