如果你想讀取一個潛在的非常大的日誌文件的第一行和最後一行,你不應該把它全部寫入一個數組,因爲它可能會消耗大量的內存。相反,只要閱讀第一行和最後一行。
您可以輕鬆閱讀第一行。
use v5.10;
use strict;
use warnings;
use autodie;
open my $fh, $logfile;
my $first = <$fh>;
您可以閱讀使用seek
跳轉到文件的末尾,然後與read
塊讀取向後,直到你得到一整行的最後一行。這可能會變得複雜。幸運的是File::ReadBackwards可以爲你做到這一點。
use Carp;
use File::ReadBackwards;
my $backwards = File::ReadBackwards->new($logfile)
or croak "Can't open $logfile: $!";
my $last = $backwards->readline;
注意,如果在文件末尾的任何雜散換行符這些將是最後一行,所以你可能想繼續讀書,直到你得到你所要尋找的。
# Read lines backwards until we get something that
# contains non-whitespace.
while(my $last = $backwards->readline) {
last if $last =~ /\S+/;
}
這裏有一個簡單,但速度較慢(大文件)的方式來獲得第一和最後一行。像以前一樣閱讀第一行,然後閱讀每一行,但只保留最後一行。
my $last;
while(my $line = <$fh>) { $last = $line }
它仍然要讀取整個文件,但它只保留最後一個在內存中。
一旦你有,你可以解析線,把它變成一個Time::Piece物體更容易的工作。
# === Verbose logging started: 1/3/2017 17:41:55 ... ===
# === Verbose logging stopped: 1/3/2017 17:49:17 ===
sub log_time {
my $line = shift;
# This captures the 1/3/2017 17:49:17 part
my($datetime) = $line =~
/^=== Verbose logging (?:started|stopped):\s*(\d+/\d+/\d+\s+\d+:\d+:\d+)/;
# Parse it into a Time::Piece object.
return Time::Piece->strptime($datetime, "%m/%d/%Y %H:%M:%S");
}
strptime
是許多語言用來解析日期(字符串解析時間)的函數。 strftime
(字符串格式時間)用於格式化日期。他們分享相同的迷你語言。看看strftime文檔瞭解那裏發生了什麼。
一旦你有,you can get the difference in seconds by subtracting them。
my $start = log_time($first);
my $end = log_time($last);
say "Seconds elapsed: ".$end - $start;
[讀取最後一行(http://stackoverflow.com/questions/36568162/how- do-i-read-the-last-line-of-a-file-with-a-bare-perl-on-windows /36570096) – mkHun