gpt4 book ai didi

arrays - Tie::File - 将文件中的 5 行获取到数组中,同时从文件中删除它们

转载 作者:行者123 更新时间:2023-12-02 04:23:34 24 4
gpt4 key购买 nike

我想打开一个文件,将 5 行插入数组中以供以后使用(如果少于 5 行,则保留剩余的行),并从文件中删除这 5 行。我是否从文件的头部或尾部删除(或推送)并不重要。

我过去曾使用过 Tie::File 并且愿意使用它,但我无法弄清楚有或没有 Tie 模块。

use Tie::File;
my $limit='5';
$DataFile='data.txt';

###open my $f, '<', $DataFile or die;

my @lines;
tie (@lines, 'Tie::File', $DataFile);
$#lines = $limit;

###while( <@lines> ) {

shift @lines if @lines <= $limit;
push (@lines, $_);

###}

print @lines;
untie @lines;

也尝试过File::ReadBackwards从我找到的一个例子来看,我不知道如何获取 5 的数组。

my $pos = do {
my $fh = File::ReadBackwards->new($DataFile) or die $!;
#@lines =(<FILE>)[1..$limit];
#$fh->readline() for 1..$limit;

my $log_line = $fh->readline for 1..$limit;

print qq~ LogLine $log_line~;

$fh->tell()};

话虽如此,这已经很接近了,但没有雪茄。如何将 5 放入数组中?

use File::ReadBackwards;
my $num_lines = 5;
my $pos = do {
my $fh = File::ReadBackwards->new($DataFile) or die $!;
$fh->readline() for 1..$num_lines;
$fh->tell()};
truncate($DataFile, $pos)or die $!;

稍后我将根据正则表达式检查数组中的每一行。不管怎样,它们仍然需要从文件中删除。

最佳答案

如果提取最后五行而不是前五行,则可以使用truncate而不是写入整个文件。此外,您可以使用 File::ReadBackwards 来获取这五行,而无需读取整个文件。对于大文件,这使得以下解决方案比 Tie::File 快得多(并且它将使用更少的内存):

use File::ReadBackwards qw( );

my $num_lines = 5;

my $fh = File::ReadBackwards->new($DataFile)
or die("Can't open $DataFile: $!\n");

my @extracted_lines;
while ($_ = $fh->readline() && @extracted_lines < $num_lines) {
push @extracted_lines, $_;
}

truncate($fh->get_handle(), $fh->tell())
or die("Can't truncate $DataFile: $!\n");

关于arrays - Tie::File - 将文件中的 5 行获取到数组中,同时从文件中删除它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28613264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com