gpt4 book ai didi

perl - 在 perl 中读取第一行和最后一行的文件解析

转载 作者:行者123 更新时间:2023-12-02 06:29:52 26 4
gpt4 key购买 nike

我有一个第一行的文件

=== Verbose logging started: 1/3/2017  17:41:55  Build type: SHIP UNICODE 5.00.7601.00  Calling process: C:\Windows\SysWOW64\msiexec.exe ===

最后一行

=== Verbose logging stopped: 1/3/2017  17:49:17 ===

我对那些行(17:41:5517:49:17)中的时间字段感兴趣,想找出从开始到停止。

我尝试读取数组中的文件并获取第一行和最后一行

my $last = pop (@array);
my $first = shift (@array);

但是获取数组中的时间字段变得越来越困难。

您能推荐其他替代方法吗?

最佳答案

如果你想读取一个可能非常大的日志文件的第一行和最后一行,你不应该把它全部放入一个数组中,因为它可能会消耗大量内存。相反,只需阅读第一行和最后一行。

你可以很容易地阅读第一行。

 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;

关于perl - 在 perl 中读取第一行和最后一行的文件解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41543002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com