【问题标题】:Perl Read/Write File Handle - Unable to OverwritePerl 读/写文件句柄 - 无法覆盖
【发布时间】:2015-07-16 04:53:10
【问题描述】:

我有一个执行特定操作并根据结果更新文件的 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 循环中读取句柄并尝试同时覆盖它,所以它可能不起作用。

谢谢。

【问题讨论】:

    标签: perl


    【解决方案1】:

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

    seek(FILE, 0, 0);
    

    【讨论】:

      【解决方案2】:

      您应该将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

      【讨论】:

        【解决方案3】:

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

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

        这应该可以解决问题

        【讨论】:

        • 你好。是的,我已经使用了这种解决方法,它对我有用。但是,我想使用相同的文件句柄来减少代码行数。
        猜你喜欢
        • 1970-01-01
        • 2013-10-18
        • 1970-01-01
        • 2018-03-05
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        相关资源
        最近更新 更多