2012-03-29 125 views
4

我有一个文本文件要在Perl中解析,我从文件开头解析它并获取所需的数据。用Perl中的数据阅读文件的最后一行

完成这一切后,我想读取数据文件的最后一行。问题是最后两行是空白的。那么,我如何得到持有任何数据的最后一行。

+0

谁投票决定关闭这个问题的人似乎有Perl的一点经验。作为一名Perl人员,我认为第一句话表明了足够的知识以通过最小理解测试。在发布微不足道(至少在Perl)代码中没有意义。 – 2014-01-30 14:32:10

回答

7

如果文件比较短,只是从您完成获取数据,保持最后一个非空行阅读:

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/; 
+0

明白了:),谢谢一堆 – fammi 2012-03-29 09:34:01

4
perl -e 'while (<>) { if ($_) {$last = $_;} } print $last;' < my_file.txt 
+0

即使是空行也包含一个非空字符串,即'\ n'。你想'if(/ \ S /)'或类似的。 – TLP 2012-03-29 09:11:48

+0

如果你想保留空白行,但跳过没有字符的行,你可以使用'while(<>){chomp;如果(长度){...'。 – Anonymous 2012-03-29 20:08:59

0

如果文件很小,我会将它存储在一个数组中,并从结尾读取。如果它很大,请使用File :: ReadBackwards模块。

2

您可以使用该模块File::ReadBackwards通过以下方式:

use File::ReadBackwards ; 
$bw = File::ReadBackwards->new('filepath') or 
    die "can't read file"; 
while(defined($log_line = $bw->readline)) { 
    print $log_line ; 
    exit 0; 
} 

如果它们是空白,只需检查$log_line\n;

0

这里是我的命令行的perl解决方案的变体:

perl -ne 'END {print $last} $last= $_ if /\S/' file.txt