-2

我正在尝试修改配置文件。

我首先将它读入@buffer,这取决于正则表达式匹配。修改后的缓冲区被写回到磁盘上,以防文件变小,截断完成。

不幸的是,这不起作用,它已经崩溃了fseek,但据我所知,我对 fseek 的使用符合 perl doc。

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 回答