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

Perl读/写文件句柄-无法覆盖,perl,Perl,我有一个Perl脚本,它执行一个特定的操作,并根据结果更新一个文件 基本概况如下: 从文件句柄、文件中读取值 执行一些操作,然后将结果与输入文件中存储的值进行比较。 如果有更改,则更新与文件句柄对应的文件。 当我说“更新”时,我的意思是用新值覆盖输入文件中的现有值 脚本概述: #! /usr/bin/perl use warnings; use diagnostics; $input=$ARGV[0]; open(FILE,"+<",$input) || die("Couldn't o

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

基本概况如下:

从文件句柄、文件中读取值 执行一些操作,然后将结果与输入文件中存储的值进行比较。 如果有更改,则更新与文件句柄对应的文件。 当我说“更新”时,我的意思是用新值覆盖输入文件中的现有值

脚本概述:

#! /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_值附加到文件中,而不是覆盖它

我已经在几个地方阅读了关于这种文件句柄模式的文档,以及它所说的无附加的读/写模式

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


谢谢。

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

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

...

close FILE;

这应该可以做到

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

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

...

close FILE;

这应该能奏效你的猜测是对的。首先读取文件,使文件指针实际位于旧值的末尾位置。我自己没有尝试过,但您可能可以在打印之前查找指向0的文件指针

seek(FILE, 0, 0);

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

seek(FILE, 0, 0);
您应该将truncate与seek一起添加到程序中

由于文件是为读写而打开的,因此写入较短的$new_值将在文件中留下一些$old_值。截断将删除它

有关详细信息,请参阅perldoc-f seek和perldoc-f truncate。您应该将truncate与seek一起添加到程序中

由于文件是为读写而打开的,因此写入较短的$new_值将在文件中留下一些$old_值。截断将删除它


有关详细信息,请参阅perldoc-f seek和perldoc-f truncate。

Hello。是的,我已经使用了这种变通方法,它对我很有效。但是,为了减少代码行数,我想使用相同的文件句柄。是的,我已经使用了这种变通方法,它对我很有效。但是,为了减少代码行数,我希望使用相同的文件句柄来执行此操作。