假设我有一个文本文件:
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 条线。我想我需要一个柜台吧?
一个基本的方法是使用标志和计数器来确定何时开始以及打印多少。单程:
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),从而通过使文件名作为参数被调用时运行该脚本。