use autodie ':io';
open(my $fh, '<', 'file_to_read.txt');
# get the data that is needed, then:
my $last_non_blank_line;
while (my $line = readline $fh) {
# choose one of the following two lines, depending what you meant
if ( $line =~ /\S/ ) { $last_non_blank_line = $line } # line isn't all whitespace
# if ( line !~ /^$/ ) { $last_non_blank_line = $line } # line has no characters before the newline
}
如果文件较长,或者您可能在初始数据收集步骤中跳过了最后一个非空行,请重新打开文件并从末尾开始读取:
my $backwards = File::ReadBackwards->new( 'file_to_read.txt' );
my $last_non_blank_line;
do {
$last_non_blank_line = $backwards->readline;
} until ! defined $last_non_blank_line || $last_non_blank_line =~ /\S/;
7条答案
按热度按时间ljsrvy3e1#
如果文件相对较短,只需从获取数据的位置继续读取,保留最后一行非空行:
如果文件较长,或者您可能在初始数据收集步骤中跳过了最后一个非空行,请重新打开文件并从末尾开始读取:
9wbgstp72#
lsmepo6l3#
可以按以下方式使用模块File::ReadBackwards:
如果它们是空的,只需检查
$log_line
是否与\n
匹配;w9apscun4#
如果文件很小,我会把它存储在一个数组中并从末尾读取。如果文件很大,使用File::ReadBackwards模块。
ogsagwnx5#
下面是我的命令行Perl解决方案的变体:
cwtwac6a6#
没有人提到
Path::Tiny
。如果文件大小相对较小,您可以这样做:CPAN页面。
请记住,对于大文件,正如@ysth所说,最好使用
File::ReadBackwards
。6ss1mwsb7#
有时候从perl代码运行shell命令对我来说更舒服。所以我更喜欢下面的代码来解决这种情况:
$result='tail -n 1 /路径/文件';