Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Tie::File-将文件中的5行放入数组,同时将它们从文件中删除_Arrays_Perl_Data Structures - Fatal编程技术网

Arrays Tie::File-将文件中的5行放入数组,同时将它们从文件中删除

Arrays Tie::File-将文件中的5行放入数组,同时将它们从文件中删除,arrays,perl,data-structures,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::

我想打开一个文件,将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;
所有这些都说明,这很接近,但没有雪茄。如何将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文件的前五行,将它们存储在另一个数组中,并在标准输出上打印删除的行:

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对于大文件的速度快得多(而且它将使用更少的内存):

使用File::ReadBackwards qw();
我的$num_行=5;
my$fh=File::ReadBackwards->new($DataFile)
或死亡(“无法打开$DataFile:$!\n”);
我的@extracted_行;
而($\=$fh->readline()&&&@提取的行数<$num行){
推送@extracted\u行,$\u;
}
截断($fh->get_handle(),$fh->tell())
或死亡(“无法截断$DataFile:$!\n”);

从文件的开头或结尾删除(然后推送结果)并不重要。任意五行。你真是个了不起的帮手。非常感谢您的课程。
splice@lines,-5
可能更快
打印移位(@lines),“\n”表示1..$limit
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;
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");