Perl在追加模式下打开文件句柄以读取

Perl在追加模式下打开文件句柄以读取,perl,Perl,我有一个文本文件,我必须在其中读取内容并附加到它。i、 e.复制文件并附加到其中。我编写了以下代码 #!/usr/bin/perl use strict; use warnings; my $line; open FILL, ">> fred" or warn "Cannot open : $!"; while(<FILL>){ # s/^Author:.*/Author: Randal L. Schwartz/; # s/^Phone:.*\n//;

我有一个文本文件,我必须在其中读取内容并附加到它。i、 e.复制文件并附加到其中。我编写了以下代码

#!/usr/bin/perl
use strict;
use warnings;
my $line;
open FILL, ">> fred"
    or warn "Cannot open : $!";
while(<FILL>){
   # s/^Author:.*/Author: Randal L. Schwartz/;
   # s/^Phone:.*\n//;
   # s/^Date:.*/Date: $date/;
    $line.=$_;
    print $line;
}
select FILL;
print $line;
输出:

Program name: granite
Author: Gilbert Bates
Company: RockSoft
Department: R&D
Phone: +1 503 555-0095
Date: Tues March 9, 2004
Version: 2.1
Size: 21k
Status: Final beta
Program name: granite
Author: Gilbert Bates
Company: RockSoft
Department: R&D
Phone: +1 503 555-0095
Date: Tues March 9, 2004
Version: 2.1
Size: 21k
Status: Final beta
这个程序工作正常

#!/usr/bin/perl
use strict;
use warnings;
my $line;
open FIL, "fred"
    or warn "Cannot open : $!";
open FILL, ">> fred"
    or warn "Cannot open : $!";
while(<FIL>){
   # s/^Author:.*/Author: Randal L. Schwartz/;
   # s/^Phone:.*\n//;
   # s/^Date:.*/Date: $date/;
    $line.=$_;
    print $line;
}
select FILL;
print $line;

为什么要打印这么多次?

$line
是一个变量,您可以在其中累积到目前为止读取的所有内容。所以在循环中,你可能想

print $_;
或者只是

print;
而不是

print $line;
要回答您最初的问题。。。您需要以读写(追加)模式打开文件

(请不要使用双参数版本的
open
。这不安全。)

但这会将文件指针放在文件的末尾,因此您必须执行以下操作:

seek FILL, 0, 0;
在阅读之前。由于您是在写入之前读取的,因此无论您是否以追加模式打开文件,都没有区别

open FILL, '>>+', 'fred';

您甚至可以在读取文件后添加另一个
seek
,但我不确定这是否可以跨Unix和Windows移植。

谢谢,我收到了。但是我也想在附加模式下使用filehandle进行读取。如果我在append模式下读取文件句柄,它根本不会进入@hillu
+>
的循环并查找文件的开头。
open FILL, '>>+', 'fred';
seek FILL, 0, 0;