如何在现有.txt文件的顶部附加新行?

时间:2016-05-16 02:09:26

标签: perl append

您好我想在现有.txt文件中追加新的数据行。我使用下面的脚本。它确实添加了新行,但它附加在底部。我想将新行添加到现有行的顶部。我怎么能这样做?

my $filename = 'file.txt';
open(my $fh, '>>', $filename) or die "Could not open file '$filename' $!";
print $fh  "-----------\n";
close $fh;

2 个答案:

答案 0 :(得分:2)

您需要重写该文件。更改内容需要先将文件的其余部分(通过正在更改的部分)保存起来,然后在新内容之后复制回来。 (因为很少有新内容具有与它替换的字节相同的字节数,除非我们想要完全覆盖单个字符。)插入更是如此 - 我们当然不能只在中间添加字节,或者在开头。 @if(accessFunction() == True) <h1>You have access, {{ Auth::user()->username }}</h1> @elseif {{ Redirect('/') }} @endif 打开文件,以便追加,将字节添加到其后面。

对于足够小的文件

>>

use warnings; use strict; my $filename = 'file_to_prepend_to.txt'; my @lines_to_prepend = ("line 1", "line 2"); # slurp the whole file into a variable my $filecont = do { local $/; open my $fh, '<', $filename or die "Can't open $filename: $!"; <$fh>; }; # open the file for writing, to overwrite open my $fh, '>', $filename or die "Can't open $filename: $!"; # write new contents first for my $line (@lines_to_prepend) { print $fh "$line\n"; } # dump the old contents now print $fh $filecont; close $fh; 将输入记录分隔符设置为local $/,以便undef一直读到最后,整个文件作为字符串返回并分配给标量。完成<>块后,文件句柄将关闭。请注意打印中的do,添加换行符 - 如果您的行预备已经删除了该行。

对于非常大的文件,您需要逐行读取并将它们写入新文件(您首先在其中编写行前置文件),然后移动该新文件以覆盖原始文件。确保临时文件的名称不能与现有文件匹配是一个非常好的主意,例如使用核心File::Temp模块。

答案 1 :(得分:1)

我建议使用核心模块Tie :: File来使用文件,就像它是一个数组一样。

使用模块执行这样一个简单的任务可能看起来有点过分,但是Tie :: File非常容易使用,您不再需要担心文件过大。

我通常做这样的事情:

use strict;
use warnings;
use Tie::File;

my $file_name        = 'file_to_prepend_to.txt';
my @lines_to_prepend = ("Prepended line 1", "Prepended line 2");

my @file_as_array;

tie @file_as_array, 'Tie::File', $file_name or
  die "Unable to tie to file $file_name: $!\n";

unshift @file_as_array, @lines_to_prepend;

untie @file_as_array;