Perl Tie :: File - 从文件中获取5行,同时从文件中删除它们

时间:2015-02-19 17:45:05

标签: arrays perl data-structures

我很快就做了很多年前我可以做的事情(由于受伤)。

我想打开一个文件,将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 $!;

我花了好几个小时。我将在稍后检查数组中的每一行与正则表达式。它们仍然需要从文件中删除。

2 个答案:

答案 0 :(得分:3)

如果您提取最后五行而不是前五行,则可以使用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");

答案 1 :(得分:2)

这将删除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;