我有一个执行特定操作的Perl脚本,根据结果,它应该更新文件。
基本概述是:
当我说,更新时,我的意思是用新的覆盖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循环中的句柄并试图同时覆盖它,所以它可能不起作用。
感谢。
答案 0 :(得分:4)
seek(FILE, 0, 0);
答案 1 :(得分: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 seek
和perldoc -f truncate
。
答案 2 :(得分:0)
您必须关闭文件句柄并打开另一个(或相同的一个,如果您愿意)设置为输出文件。像这样。
close FILE;
open FILE, ">$input" or die $!;
...
close FILE;
应该做的伎俩