【问题标题】:Perl opening file handle in append mode to readPerl以附加模式打开文件句柄以读取
【发布时间】:2013-12-26 04:30:11
【问题描述】:

我有一个文本文件,我必须在其中读取内容并附加到它。即制作文件的副本并附加到它。我写了以下代码

#!/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;

但是它根本没有进入while循环,当我在读取模式下打开同一个文件的文件句柄并在附加模式下选择文件句柄来打印它时,它可以工作。

输入:

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
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;

它正确附加在文件中,但终端输出是

Program name: granite
Program name: granite
Author: Gilbert Bates
Program name: granite
Author: Gilbert Bates
Company: RockSoft
Program name: granite
Author: Gilbert Bates
Company: RockSoft
Department: R&D
Program name: granite
Author: Gilbert Bates
Company: RockSoft
Department: R&D
Phone: +1 503 555-0095
Program name: granite
Author: Gilbert Bates
Company: RockSoft
Department: R&D
Phone: +1 503 555-0095
Date: Tues March 9, 2004
Program name: granite
Author: Gilbert Bates
Company: RockSoft
Department: R&D
Phone: +1 503 555-0095
Date: Tues March 9, 2004
Version: 2.1
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
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

为什么会打印这么多次?

【问题讨论】:

  • +&gt;&gt; 并寻找文件的开头。

标签: perl


【解决方案1】:

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

print $_;

或者只是

print;

而不是

print $line;

要回答您的原始问题...您需要以读写(附加)模式打开文件。

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

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

但这会将文件指针放在文件末尾,所以你必须做一个

seek FILL, 0, 0;

阅读前。既然是先读后写,那么是否以追加模式打开文件没有区别。

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

【讨论】:

  • 谢谢我知道了。但我也想在附加模式下使用文件句柄进行阅读。如果我以附加模式读取文件句柄,它根本不会进入循环@hillu
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多