perl - 如何根据文件的位置从文件中提取行

Sha*_*haw 0 regex perl

我正在处理文本文件以提取包含时间戳的行,然后对这些时间戳执行计算.该行包含一个时间戳,后跟一条消息,我正在执行正则表达式以提取.

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的事件?

非常感谢这里的任何帮助!

Bor*_*din 5

此解决方案使用范围运算符查找第一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)