我有一个包含以下内容的输入文件
SCHEDULE "TEST"
DESCRIPTION "Do Some stuff"
MINUTE "53"
HOUR "21"
SCHEDULE "DUMMY CHECK"
DESCRIPTION "Do some stuff"
Check something
INTERVAL "10m"
MINUTE "50"
HOUR "21"
我需要在匹配线SCHEDULE“DUMMY CHECK”之后匹配第3行,这是INTERVAL“10m”。 (修改:并从中获取10m
。)我已为此目的编写了以下代码,但我不确定这是否确切这样做的方式,或者我们有任何简单的其他逻辑。
use strict;
use warnings;
my $file = "input.txt";
my @data;
open (IN,"<","$file");
my $count = 0;
while (<IN>) {
$count = 1 if /SCHEDULE\s"(DUMMY\sCHECK)".*/;
if ($count >= 1 and $count <= 6) {
@data = $_;
print @data;
$count++;
}
}
答案 0 :(得分:2)
更新:如果INTERVAL
行之后的第4行<{1}},请在DUMMY
行获取数据
use strict;
use warnings;
use feature 'say';
my $file = shift @ARGV or usage();
open my $fh_in, '<', $file or die "Can't open $file: $!";
my $offset = 4;
my $anchor;
while (<$fh_in>) {
$anchor = $. if /SCHEDULE\s"DUMMY\sCHECK"/;
if ($anchor and $. == $anchor+$offset and /^\s*INTERVAL\s*"(.*?)"/) {
#print; # the whole line
say "interval is: $1"; # captured data on the line
}
}
sub usage {
say STDERR "Usage: $0 filename";
exit;
}
$.
variable具有上次访问的文件句柄中的当前行号。
答案 1 :(得分:0)
我会使用flip-flop
运算符。这使您只能在SCHEDULE“DUMMY CHECK”部分进行操作。从那里开始,你所在的线路并不重要,你可以捕获INTERVAL字段。
use v5.10;
open (IN,"<","$ARGV[0]");
while (<IN>) {
if (/^SCHEDULE "DUMMY CHECK"/ .. eof) {
say "interval: $1" if /INTERVAL (.*)/
}
}
请注意,我使用eof
作为触发器终结器。如果数据文件还有更多,你可以“翻转”另一个正则表达式(可能是/^SCHEDULE/
)。