1回のファイルオープンで読み書きを同時にする - Perl

open関数でファイルを開き、読み書きを同時に行いたい場合はどうすれば良いだろうか?これを解決するには単純にファイルの読み書きモードを使用すれば良い。

サンプル

#-------------------------------
#読み書きモードで開く
#-------------------------------
open(DAT, "+<file.txt");
flock(DAT, 2); # flockでロックをすれば読み書き両方がロック出来る

#-------------------------------
#ファイル読込
#-------------------------------
$buff = <DAT>;
# @buff = <DAT>;

#-------------------------------
#ファイルに記録
#-------------------------------
truncate(DAT, 0); #ファイルサイズを0byteに
seek(DAT, 0, 0); #書き込む場所をファイルの先頭に
print DAT "Hello!"; #ファイルに記録
close(DAT);

例えばアクセスカウンターなどを作成した際にファイルロックが不十分だと、現在の値を読込むためにファイルを開き閉じる、その後書き込みむためにファイルを開き...という処理を行っていると、読み書きの間に他のプロセスが発生した場合に不整合が発生する可能性がある。

もちろん、これ以外にも解決方法はあるが、ひとつの解法として覚えておいて損はない。