perlでprintfデバッグするにはData::Dumperがおなじみかと思いますが、printfデバッグでは「○○が××なのではないか」という仮説を1つずつ検証していくことになり大変なときもあります。Perlはスタックトレースとかをあまり吐いてくれないし大変だと思いきや、エラーの可視化などに便利なモジュールがあったのでメモりました。
変な場所でdieまたはwarnが出て困っている場合 => Carp::Always
warnまたはdieが出た時に、スタックトレースを引数付きで表示してくれます。warnやdieが出るが、どこから呼び出された時に、どんな引数のときにで出ているのかわからない場合に便利です。
※ Carp::Always::Colorというモジュールもあるようですが、まだ試していません。
use Carp::Always;を適当な場所に追加(読み込まれればどこでもOK)
SQLが怪しい場合 => Devel::KYTProf
プロファイリング用のモジュールですが、SQLクエリの文とプレースホルダの中身が表示されるため、デバッグに重宝します。
use Devel::KYTProf;を適当な場所に追加(読み込まれればどこでもOK)
怪しい構文、変数、関数をいろいろチェックしたい時 => (Devel::REPL, Carp::REPL)
REPLは乱暴に言えばプロンプトのことです。Devel::REPLは、シェルから使える"re.pl"コマンドで、単独のperlプロンプトを起動することができます。これは構文の動作(複雑な式の挙動など)を確認したい時に大いに役立ちます。
Carp::REPLはdieした場所や、プログラム中の任意の場所でプロンプトを起動します。変数の中身の確認と編集、関数の返り値のチェックなど、なんでもできるようになります。rubyのbinding.pryをご存知の方は、それのperl版がだいたいこれです。
※ 起動時に「モジュールくれ」と言われるので、Term::ReadLine::GnuまたはTerm::ReadLine::Perlも一緒にインストールしておきましょう。また、自分でインストールしたときにはFile::Nextへの依存関係が欠落していたので、別途インストールする必要がありました。今は修正されているかもしれません。
dieした時にプロンプトを起動する
perl -MCarp::REPL script.plと指定して起動するか、use Carp::REPL;を適当な場所に追加
プロンプト内では、変数名を叩くだけで変数の中身がdumpされます。
プログラム中の任意の場所でプロンプトを起動する
変数を書き換えるなどしたあと、CTRL+Dで続行することができます。
まとめ
- Carp::Always
- エラーやスタックトレースの可視化
- useするだけ
- Devel::KYTProf
- SQLの可視化
- useするだけ
- Devel::REPL
- プロンプトで構文や式の動作を確認
- re.plコマンド
- Carp::REPL
- プログラムの途中でプロンプトを起動
- dieしたところで使うなら、perl -MCarp::REPL script.plまたはuseするだけ
- repl関数を使って任意の場所で起動
他にもこんなのがあるよ、こっちのほうが便利だよ!というものがあればぜひコメントで教えて下さいmm
happy perl hacking :-)
追記:あとで見たら微妙に4種になってました・・すみませんでしたmm