1

特定の操作を実行する Perl スクリプトがあり、その結果に基づいてファイルを更新する必要があります。

基本的な概要は次のとおりです。

  1. ファイルハンドル FILE から値を読み取ります
  2. 何らかの操作を実行し、その結果を INPUT ファイルに格納されている値と比較します。
  3. 変更がある場合は、File Handle に対応するファイルを更新します。

更新と言うとき、つまり、INPUTファイルの既存の値を新しい値で上書きします。

スクリプトの概要:

#! /usr/bin/perl

use warnings;
use diagnostics;

$input=$ARGV[0];
open(FILE,"+<",$input) || die("Couldn't open the file, $input with error: $!\n");

# perform some operation and set $new_value here.

while(<FILE>)
{
chomp $_;
$old_value=$_;
if($new_value!=$old_value)
{
 print FILE $new_value,"\n";
}
}

close FILE;

ただし、これは $new_value をファイルに上書きする代わりに追加します。

私は FILE ハンドルのこのモードに関するドキュメントをいくつかの場所で読みました。

なぜ上書きできないのかわかりません。私が考えることができる1つの理由は、whileループでハンドルから読み取り、同時に上書きしようとしているため、機能しない可能性があることです。

ありがとう。

4

3 に答える 3

4

あなたの推測は正しいです。最初にファイルを読み取るので、ファイルポインタは実際には古い値の終わりの位置にあります。私はこれを自分で試していませんが、印刷する前に 0 へのファイル ポインタを探すことができるでしょう。

seek(FILE, 0, 0);
于 2012-08-18T01:25:09.940 に答える
1

truncateと一緒にプログラムに追加する必要がありますseek

if( $new_value != $old_value )
{
    seek( FILE, 0, 0 );
    truncate FILE, 0;
    print FILE $new_value,"\n";
}

ファイルは読み取りと書き込み用に開かれているため、短い文字を書き込むと、ファイル$new_valueの一部が残り$old_valueます。truncateそれを削除します。

詳細については、を参照perldoc -f seekperldoc -f truncateてください。

于 2012-08-18T13:23:06.030 に答える
0

ファイルハンドルを閉じて、出力ファイルに設定された別のもの (または必要に応じて同じもの) を開く必要があります。このような。

close FILE;
open FILE, ">$input" or die $!;

...

close FILE;

それはトリックを行う必要があります

于 2012-08-18T01:20:46.723 に答える