如何在perl中的模式后提取一定数量的行?

Mak*_*uza 4 perl file

假设我有一个文本文件:

Line 1
Line 2
Target Name1
Line 3
Line 4
Line 5
Line 6
Target Name2
Line 7
Line 8
Line 9
Line 10
Run Code Online (Sandbox Code Playgroud)

我希望能够搜索目标模式(文本文件中可能有多个,如上例所示),然后打印出一定数量的跟随它的行。让我们说3行。那么我想要的输出是

Target Name1
Line 3
Line 4
Line 5

Target Name2
Line 7 
Line 8
Line 9
Run Code Online (Sandbox Code Playgroud)

到目前为止,我所拥有的只是查找目标并将其打印出来的代码:

use strict;
use warning;
open (my $INFILE, $input_file);
my $outfile = "output.txt";
open (my $OUTFILE, '>', $outfile);

my $name;

while (my $line = <$INFILE>) {
  if ($line =~ m#TARGET\s+(\S+)#){
    $name = $1;
    print $OUTFILE "Target $name\n";
  }
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何打印出 Target 后面的 3 行。注意:假设目标之间的距离始终大于 3 条线。我想我需要一个柜台吧?

zdi*_*dim 5

一个基本的方法是使用标志和计数器来确定何时开始以及打印多少。单程:

use warnings;
use strict;

my $how_many = 3;

my $to_print = 0;    
while (<>) { 
    $to_print = 1+$how_many  if /Target\s+\S+/;

    print if $to_print-- > 0;
}
Run Code Online (Sandbox Code Playgroud)

这使用一个变量来控制操作,设置为每当看到“触发器”时要打印的行数(加一),然后每次打印都会倒计时。它做出了一些假设。

的<>操作者 读取来自命令行给出文件的行(或从STDIN),从而通过使文件名作为参数被调用时运行该脚本。