塩茶コンバータみたび

スクリプト中の入出力文字コードをハードコーディングしてる部分を、全部変数にしてしまいました。これで出力文字コードの変更も簡単にできます。万が一入力から変わってしまってもすぐに対応できるしね。
あとは、sysopenをオーバーライドするようにしました。

sysopen $fh, $file, $mode or die "$!\n";
flock $fh, LOCK_EX or die "$!\n";
seek $fh, 0, 0 or die "$!\n";
truncate $fh, 0 or die "$!\n";

の一連の流れを何回も記述するのはDRY*1に反するし。モジュールを書いて、そこからsysopenをインポートしてやることで、組み込み関数のオーバーライドができます。オーバーライドする前の組み込み関数にアクセスしたいときはCORE::擬似パッケージを使って、CORE::sysopenとしてやればok。

追記

seek $fh, 0, 0 or die "$!\n";
truncate $fh, 0 or die "$!\n";

は、sysopenのモードを指定するときにO_TRUNCを指定しておけば勝手に切り詰めてくれるので、この2行は不要。オーバーライドするモジュールもいろいろ変更してあります。CPANに出すほどのものじゃないけど、File::sysopenなるパッケージ名をつけて、ローカルでは好きなときに使えるように。単純にsysopenをオーバーライドして、共有か排他の適切なロックを掛けるだけのモジュールなんですけどね。一応、Config.pm$Config{d_flock}を確認して、flockableなときだけflockします。それ以外はまったくなにもしない、シンプルなモジュール。

*1:Don't Repeat Yourself