Tie::File - 从文件中获取 5 行到数组中,同时从文件中删除它们
Tie::File - Get 5 lines from a file into an array while removing them from file
我想打开一个文件,将 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 $!;
稍后我会根据正则表达式检查数组中的每一行。无论哪种方式,它们仍然需要从文件中删除。
这将删除 data.txt 文件的前五行,将它们存储在另一个数组中并在 STDOUT 上打印删除的行:
use warnings;
use strict;
use Tie::File;
my $limit = 5;
my $DataFile = 'data.txt';
tie my @lines, 'Tie::File', $DataFile or die $!;
my @keeps = splice @lines, 0, $limit;
print "$_\n" for @keeps;
untie @lines;
如果提取最后五行而不是前五行,则可以使用 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");
我想打开一个文件,将 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 $!;
稍后我会根据正则表达式检查数组中的每一行。无论哪种方式,它们仍然需要从文件中删除。
这将删除 data.txt 文件的前五行,将它们存储在另一个数组中并在 STDOUT 上打印删除的行:
use warnings;
use strict;
use Tie::File;
my $limit = 5;
my $DataFile = 'data.txt';
tie my @lines, 'Tie::File', $DataFile or die $!;
my @keeps = splice @lines, 0, $limit;
print "$_\n" for @keeps;
untie @lines;
如果提取最后五行而不是前五行,则可以使用 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");