您好我想在现有.txt
文件中追加新的数据行。我使用下面的脚本。它确实添加了新行,但它附加在底部。我想将新行添加到现有行的顶部。我怎么能这样做?
my $filename = 'file.txt';
open(my $fh, '>>', $filename) or die "Could not open file '$filename' $!";
print $fh "-----------\n";
close $fh;
答案 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;