8.13 ランダムアクセスファイルを更新する

バイナリファイルからレコードを読み込み、その値を変更して書き戻したい。

  • 最初にレコードをreadして、対象の値を更新する。その更新した値をpackして、前のアドレスにseekして書き戻す。
use Fcntl;   # SEEK_SET定数とSEEK_CUR定数を使用するため

$ADDRESS = $RECSIZE * $RECNO;
seek(FH, $ADDRESS, SEEK_SET) or die;
read(FH, $BUFFER, $RECSIZE) == $RECSIZE or die;

@FIELDS = unpack($FORMAT, $BUFFER);
# フィールドを更新する
$BUFFER = pack($FORMAT, @FIELDS);
seek(FH, -$RECSIZE, SEEK_CUR) or die;
print FH $BUFFER;
close FH;