如何获取存储在变量中的文件的最后几行?在linux上,如果结尾命令在文件中,我会使用它。
1) How can I do this in perl if the data is in a file?
2) How can I do this if the content of the file is in a variable?
发布于 2011-07-13 05:13:10
在某种程度上,这取决于文件有多大,以及您想要多少行。如果它非常大,你需要小心,因为把它全部读到内存中比只读文件的最后一部分要花更长的时间。
如果它很小。最简单的方法可能是将其保存到内存中,通过记录分隔符进行File::Slurp
,并保留最后n条记录。实际上,就像这样:
# first line if not yet in a string
my $string = File::Slurp::read_file($filename);
my @lines = split(/\n/, $string);
print join("\n", @lines[-10..-1])
如果它很大,太大,无法在内存中找到,那么您可能更好地直接使用文件系统操作。当我这样做时,我打开文件并使用seek()
读取文件的最后4k左右,然后向后重复,直到我有足够的数据来获得所需的记录数。
不是一个详细的答案,但问题可能会更具体一些。
发布于 2011-07-13 05:21:59
要读取文件的末尾,请在文件末尾附近执行seek
并开始读取。例如,
open my $fh, '<', $file;
seek $fh, -1000, 2;
my @lines = <$fh>;
close $fh;
print "Last 5 lines of $file are: ", @lines[-5 .. -1];
根据文件中的内容或要查看的行数,您可能希望使用与上面的-1000
不同的幻数。
您也可以使用变量执行类似的操作
open my $fh, '<', \$the_variable;
seek $fh, -1000, 2;
或者只是
open my $fh, '<', \substr($the_variable, -1000);
将为您提供一个生成$the_variable
中最后1000个字符的I/O句柄。
发布于 2011-07-13 06:37:43
CPAN上的File::ReadBackwards
模块可能就是您想要的。你可以这样使用它。这将打印文件中的最后三行:
use File::ReadBackwards
my $bw = File::ReadBackwards->new("some_file");
print reverse map { $bw->readline() } (1 .. 3);
在内部,它会在文件末尾附近查找(),并查找行尾,因此即使对于非常大的文件,它在内存方面也应该相当有效。
https://stackoverflow.com/questions/6671065
复制相似问题