我正在处理文本文件以提取包含时间戳的行,然后对这些时间戳执行计算.该行包含一个时间戳,后跟一条消息,我正在执行正则表达式以提取.
TIME | MESSAGE
20:48:27.159 | FOO
20:48:47.353 | BAR
20:48:49.227 | SPAM
20:48:52.192 | FOO
Run Code Online (Sandbox Code Playgroud)
下面是我正在对文件执行的正则表达式的sudo代码
... .... ...
open (my $FH, "<", $file) or die "Cannot open <$file>: $!";
for my $line (<$FH>) {
if ($line =~ /bar/) {
my $ts1 = ExtractTimestamp($line);
} elsif ($line =~ /FOO/) {
my $ts2 = ExtractTimestamp($line);
}
}
my $diff = $ts2 - $ts1;
Run Code Online (Sandbox Code Playgroud)
这里的问题是正则表达式找到第一次出现的行并提取它,这给我留下了负时间戳.我想知道在perl中是否有任何模块或任何技术我可以在BAR之后提取文件中出现的FOO的事件?
非常感谢这里的任何帮助!
此解决方案使用范围运算符查找第一BAR行,后面跟着第一FOO行.如果记录中的时间@ts是范围中的第一行或最后一行,则将记录中的时间推送到数组中
use strict;
use warnings;
my @ts;
while ( <DATA> ) {
next unless my $state = /BAR/ .. /FOO/;
push @ts, /([\d:.]+)/ if $state == 1 or $state =~ /E/;
}
print join(' ... ', @ts), "\n";
__DATA__
TIME | MESSAGE
20:48:27.159 | FOO
20:48:47.353 | BAR
20:48:49.227 | SPAM
20:48:52.192 | FOO
Run Code Online (Sandbox Code Playgroud)
20:48:47.353 ... 20:48:52.192
Run Code Online (Sandbox Code Playgroud)