如何在Perl中模拟'grep -B'功能?

dar*_*s33 3 regex perl grep

我一直在寻找一种解决方案,允许我搜索数组的行,如果匹配字符串,则将该行和前两行推入数组.看起来这很容易使用grep命令完成.但是,我不能让这个工作.这就是我所拥有的:

sub ipsearch {
    my $ip = $_[0];
    my @IPVSCONFIG =  grep (/\W+virtual\s$ip\s/, @RAWDATA);
}
Run Code Online (Sandbox Code Playgroud)

是否可以在grep命令中添加"-B 2"语法?我已经尝试了这种语法的几种形式,但我无法让它工作:

@IPVSCONFIG =  grep -B 2 (/\W+virtual\s$ip\s/, @RAWDATA);
Run Code Online (Sandbox Code Playgroud)

如果可能的话,请告诉我,以及正确的语法应该是什么.如果您有任何其他建议,请告诉我.

谢谢您的帮助!

Zai*_*aid 5

诀窍是识别匹配发生的行,然后识别相关的索引:

获取匹配的索引:

my @matchedIndices = grep { $RAWDATA[$_] =~ /\W+virtual\s$ip\s/ } 2 .. $#RAWDATA;
Run Code Online (Sandbox Code Playgroud)

得到指数:

my @wantedIndices  = map { ( $_-2 .. $_ ) } @matchedIndices;
Run Code Online (Sandbox Code Playgroud)

并采取数组切片:

my @IPVSCONFIG = @RAWDATA[ @wantedIndices ];
Run Code Online (Sandbox Code Playgroud)

将它完全放在Schwartzian变换中:

my @IPVCONFIG = map  { @RAWDATA[$_-2..$_] }
                grep { $RAWDATA[$_] =~ /\W+virtual\s$ip\s/ }
                2 .. $#RAWDATA ;
Run Code Online (Sandbox Code Playgroud)

绝对是比传统命令行更繁忙的解决方案grep -B 2!