-2

設定ファイルを変更しようとしています。

@buffer正規表現の一致に応じて、最初にそれをに読み込みます。変更されたバッファはディスクに書き戻され、ファイルが小さくなった場合は切り捨てが行われます。

残念ながら、これは機能せず、すでにでクラッシュしfseekますが、私が言える限り、fseekの使用法はperldocに準拠しています。

open (my $file, "+<", "somefilethatexists.txt");
flock ($file, LOCK_EX);
foreach my $line (<$file>) {
    if ($line =~ m/(something)*/) {
        push (@buffer, $line);
    }
}
print "A\n";
seek($file,0,0); #seek to the beginning, we read some data already

print "B\n"; # never appears

write($file, join('\n',@buffer)); #write new data
truncate($file, tell($file)); #get rid of everything beyond the just written data
flock($file, LOCK_UN);
close ($file);
4

3 に答える 3

3

perlopentut読み取りと書き込みの混合についてこれを言います

...ファイルの更新に関しては...おそらくこのアプローチを更新に使用したくないでしょう。

これに使用する必要がありますTie::File。同じファイルハンドルで読み取りと書き込みの両方のためにファイルを開き、ファイルを行の配列として扱うことができます

use strict;
use warnings;

use Tie::File;

tie my @file, 'Tie::File', 'somefilethatexists.txt' or die $!;

for (my $i = 0; $i < @file; ) {
  if (m/(something)*/) {
    $i++;
  }
  else {
    splice @file, $i, 1;
  }
}

untie @file;
于 2012-08-17T12:49:26.757 に答える
1

多分あなたはこれを試すことができます:

$^I = '.bak';
@ARGV = 'somefilethatexists.txt';
while (<>) {
    if (/(something)*/) {
        print;
    }
}
于 2012-08-17T09:53:33.140 に答える
1

あなたのfseek()fwrite()そしてftruncate()関数はどこで定義されていますか?Perlにはこれらの機能はありません。seek()print()(またはsyswrite())およびを使用する必要がありtruncate()ます。私たちが何も知らない関数を使用している場合、私たちは本当にあなたを助けることはできません。

また、ファイルのロックを解除するための明示的な呼び出しや、ファイルを閉じるための呼び出しも必要ありません(おそらく必要ありません)。$file変数がスコープから外れるとすぐに、ファイルハンドルが閉じられ、ロックが解除されます。

于 2012-08-17T10:28:44.380 に答える