2012-03-29 117 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