@kyanny's blog

My thoughts, my life. Views/opinions are my own.

MooseX::SimpleConfig の使い方を覚えた

MooseX::Getopt には慣れてきたので、次はコマンドラインオプションだけじゃなくて設定ファイルの読み込みもやりたくなった。何かないかとおもって、何をどう調べたか忘れたけど http://mt.endeworks.jp/d-6/2009/10/twitter-on-hamaki.html をみて --configfile に何かありそうだと当たりをつけて Hamaki のソースを読んだら、 MooseX::SimpleConfig というのを使ってた。

ので自分でも使ってみた。 MooseX::Getopt と組み合わせると便利みたい(というかその組み合わせで使うように作られてるのかも)。改めて moosex config でぐぐったら http://mt.endeworks.jp/d-6/2008/07/moosex-configfromfile.html という記事も見つかった。一年以上前だ。おぼろげに読んだ覚えがある。

練習のために書いたソースを gist に置いた。

メタプログラミングとか型とかそういうのはさっぱりわかってないまま適当に使ってるけど、こういうちまちました周辺の部分でもって恩恵を受けているなと思う。クラスを一個作らなきゃいけないけど(別に同じファイルに書いてもいいのだろうが)、 Getopt::Long と Pod::Usage を駆使していたのと比べるとかなり記述量は減って精神的にも楽になった。このうえ設定ファイルのロードまで簡単に書けるなら、もう MooseX::Getopt と MooseX::SimpleConfig を使わない理由はないなと思った。


以下は余談。これやってる最中に、 Class::C3 がロードできなくてエラるのでへんだなと思いつつ入れようとしたら、 cpan コマンドでは up to date になってるのに perldoc でひこうとすると見つからない、というおかしな状態に陥った。前にも似たような目にあっていて(Test::Simple とか Carp::Clan とかで)、その時は tarball から手で入れたので今度も同様にしたのだけど、 Sub::Name とかもダメでなんかうまく解決しなかったので少し本腰を入れて調べた。

PATH をみたら /opt/local/bin が /usr/bin よりも前にきていて、 /usr/bin/env perl は /opt/local/bin/perl をさしていることがわかった(もちろん俺が昔 macports の perl をメインで使ってたときにやったんだろう)。で /opt/local 以下で find をかけてみるとやっぱり Sub/Name.pm があった。いまは local::lib を使ってるのだけど、なんか $HOME/perl5/lib/perl5 以下にはないけど /opt/local/... 以下にはあるモジュールの場合にコケるような気がしたので、一度 macports の perl を消した。

依存がいっぱいあったので sudo port uninstall --follow-dependents とかしたり、 perl に依存してるパッケージのいくつかが複数バージョンはいっててどれか指定しろとか怒られるのでちまちま手で消したりしつつどうにか消し終わって改めて perl5 を入れた(せっかくなので perl5.10 にした)。しかし git-core が perl5.8 に依存してるので結局 perl5.8 もインストールされる。それはいいのだが /opt/local/bin/perl が perl5.8 になってしまい、 perl5.10 を使うのがほんの少しだけ不便に感じた。

macports の python は複数バージョンを切り替えられたよなーと思ってぐぐったら python_select をみつけたので、 perl_select もあるかと思ったがなかった。

さらに入れ直したところでやっぱり /opt/local/bin/perl で上のスクリプトを実行するとエラー。 /usr/bin/perl をつかうといける。 /opt/local/ 以下の perl5lib は入れ直したのでキレイになってるんじゃないかなぁと思うが面倒くさくなったので PATH の順番を書き換えることで対応した。

そして sudo port contents perl5.10 をみたら、そもそも /opt/local/bin/perl は含まれてなかったのでやっぱり perl5.10 ってフルに名前を指定する必要があるみたいだ。