读取和写入perl中的现有文件

时间:2012-08-22 09:28:20

标签: perl

我想使用perl读取和写入现有文件。

任何人都可以告诉我为此目的必须使用的模式是什么: 我对以下可用模式感到困惑。 我尝试使用+>,但没有写入文件。

mode operand create truncate 
read     <   
write    >    ✓      ✓ 
append  >>    ✓  

mode       operand create truncate 
read/write  +<   
read/write  +>       ✓      ✓ 
read/append +>>      ✓  

例如:  我有一个如下文件:

one
two 
four

我想在两者之间插入一行,如:

one
two
three
four

3 个答案:

答案 0 :(得分:2)

查看perlopentutMixing Reads and Writes的评论。结论是混合模式开放模式都不理想,就地编辑模式(使用$^I)是更好的解决方案。

对于这个特殊问题,我推荐使用Tie::File模块,它允许您将文件视为一个简单的数组。

例如,要将行three插入示例数据,请编写

use strict;
use warnings;

use Tie::File;

tie my @file, 'Tie::File', 'myfile.txt' or die $!;

splice @file, 2, 0, 'three';

untie @file or die $!;

答案 1 :(得分:1)

perldoc for open开始,您有两个直接问题:

  

+&LT;几乎总是首选读/写更新 - +&gt;模式会首先破坏文件。

  

通常不能使用读写模式来更新文本文件,   因为他们有可变长度的记录。

更一般地说,在尝试在文件中间插入数据时遇到设计问题 - 文本文件不能像那样工作。最简单的方法是:

  1. 将整个文件读入内存,然后编写带有修改的文件
  2. 逐行读取输入文件,将输出写入另一个带有修改的文件。然后删除原始文件并将新文件重命名为旧名称。
  3. 1)是最简单的,但如果文件很大,2)会更节省内存。

    编辑:还有a -i switch that allows Perl to edit files in-place。它通过在幕后为您实施2)来实现。但是,我个人更愿意坚持自己做。这似乎比它的价值更令人困惑。

答案 2 :(得分:1)

因为必须移动数据,就地文件插入可能有点困难。请参阅 dan1111 answer,了解如何以其他方式实现目标(这是首选)。

但是,为了就地插入:

#!/usr/bin/env perl

use strict;
use warnings;

my $file = 'input';
open my $fh, '+<', $file or die "Failed to open $file: $!";

my $pos, @remaining_lines;
while (<$fh>) {
    if ($pos) {
        push @remaining_lines, $_;
    }
    elsif (m{^two$/$}) {
        $pos = tell;
    }
}

my $word = 'three';
seek $fh, $pos, 0;
print $fh $word, $/, @remaining_lines;