1

我有一个执行特定操作并根据结果更新文件的 Perl 脚本。

基本概述是:

  1. 从文件句柄 FILE 中读取一个值
  2. 执行一些操作,然后将结果与存储在 INPUT 文件中的值进行比较。
  3. 如果有变化,则更新文件句柄对应的文件。

当我说更新时,我的意思是用新的值覆盖 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 Handle 模式的文档,并且在它所说的所有地方,读/写模式都没有附加。

我不确定,为什么它无法覆盖。我能想到的一个原因是,由于我正在读取 while 循环中的句柄并尝试同时覆盖它,因此它可能无法正常工作。

谢谢。

4

3 回答 3

4

你的猜测是正确的。您首先读取文件,因此文件指针实际上位于旧值末尾的位置。我自己没有尝试过,但您可能可以在打印出来之前寻找指向 0 的文件指针。

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

您应该truncateseek.

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

由于文件是为读写而打开的,写一个较短的文件$new_value会在文件中留下一些$old_valuetruncate将删除它。

有关详细信息,请参见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 回答