我想使用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
答案 0 :(得分:2)
查看perlopentut
对Mixing 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)会更节省内存。
编辑:还有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;