塩茶コンバータみたび
スクリプト中の入出力文字コードをハードコーディングしてる部分を、全部変数にしてしまいました。これで出力文字コードの変更も簡単にできます。万が一入力から変わってしまってもすぐに対応できるしね。
あとは、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