Perl读/写文件句柄 - 无法覆盖

时间:2012-08-18 01:14:51

标签: perl

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

基本概述是:

  1. 从文件句柄FILE
  2. 中读取一个值
  3. 执行一些操作,然后将结果与存储在INPUT文件中的值进行比较。
  4. 如果有更改,则更新与文件句柄对应的文件。
  5. 当我说,更新时,我的意思是用新的覆盖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循环中的句柄并试图同时覆盖它,所以它可能不起作用。

    感谢。

3 个答案:

答案 0 :(得分:4)

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

seek(FILE, 0, 0);

答案 1 :(得分: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

答案 2 :(得分:0)

您必须关闭文件句柄并打开另一个(或相同的一个,如果您愿意)设置为输出文件。像这样。

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

...

close FILE;

应该做的伎俩