Perlで一枚岩のスクリプトをテスタブルにする
Perlで単一ファイルのスクリプトを書くと、すぐに配置して動かせるので重宝しますが、テストを書きづらいのが難点です。
ちゃんとpmファイルに分割して云々とかやると単一ファイルで動かなくなるし、かと言ってfatpackするのもちょっとした用途だったらやり過ぎだしめんどくさい。
ということで以下のように書いてはどうか。
if ($0 eq __FILE__) {
main();
}
sub main {
...
}
$0
に実行ファイル名が入っているので、それがスクリプトファイル名と一致していたらmainの処理を実行する。pythonのif __name__ == '__main__':
みたいな感じ。
このスクリプトをテストしたいときは、普通にテストスクリプトを書いてrequire 'main.pl';
とかやれば、plファイルの中で定義されている関数とかが個別に呼び出せるのでそれをテストしてやればよい。plファイルをrequireするとかPerl4感が漂うのは気にしない方向で。
どうかなーとかTwitterで言ってたら、@tokuhiromがリプくれてまあアリっぽいのでまとめた。
@songmu わりとそういう風に書くケースありますよー。
— tokuhirom (@tokuhirom) 2014, 8月 13
追記1
@hisaichiのコメントにあるようにcaller使っても良さそう。
main() unless caller;
追記2
以下の@kazuhoさんのエントリに知見が色々まとまっていることを教えてもらった。