perlの更新より前にインストールしたperl moduleの一覧を得る

portsperlperl-5.8.9 になったのでアップデートしたら re.pl や cpan の終了時に core dump するようになった。
perl を更新した際には perl-after-update というスクリプトperl module の移行ができるんだけど、これは再ビルドしてくれるわけではないみたい。

core dump はたぶんモジュールの解放のときにデストラクタっぽい何かで間違った関数を呼んでいるのが原因だろうと思うので、再ビルドすれば直りそうだ。

そこで、perlを更新する前にインストールしたモジュールのパッケージ名を得るためのワンライナーを書いた。

ls -tr /var/db/pkg/*/+DESC | sed -e 's@/+DESC@@' | grep 'p5\|perl' | grep -v php | grep -B 200 perl-5.8.9 | grep -v perl-5.8.9 | perl -p -e 's/.*p5-/p5-/;s/-(\d+[._,]?)+//' > oldperlpkgs

適当に継ぎ足しながら書いたので凄く汚い。 grep が連続していたり sedperl を使っている辺りが香ばしい。

portupgrade -f `cat oldperlpkgs`

として必要なパッケージをリビルドした。これ FreeBSD のことだし他に正しい方法があるよね……。gentoo の revdep-rebuild 的な何かがあるんじゃないだろうか。