在Perl脚本中的文件中匹配模式之后解析一行

时间:2017-08-09 09:08:03

标签: regex perl file

给定格式的文件:

Foo:
  var1 = 1
  var2 = 2
  var3 = 3
Bar: 
  var1 = 4
  var2 = 5
  var3 = 6
Baz:
  var1 = 7
  var2 = 8  
  var3 = 9

我想打开这个文件,逐行读取并找到出现在模式Baz之后的出现var3,并在perl脚本中从中获取值9。什么是最好的正则表达式?

sub getValue {
    open($fh, $file);
    while(my $line = <$fh>) {
        chomp($line);
        if($line =~ "regex here" ) {
        my $value = $3;
        }
    }
    return $value;
}

因此,正确的正则表达式,我希望这个子返回值为9。

1 个答案:

答案 0 :(得分:3)

由于您逐行处理,您需要保持状态,以了解何时进入Baz:部分

my $in_sec;

while (<$fh>) 
{    
    if    (/^Baz:/)     { $in_sec = 1; }
    elsif (/(?<!Baz):/) { $in_sec = 0; }

    if ($in_sec) {
        my ($num) = /var3\s*=\s*(\d+)/;
        say $num if $num;
    }   
}

当另一个部分启动时,该标志会被关闭,使用negative lookbehind检测到。

或者,将整个文件读入标量,以便您可以跨行匹配。

请使用词法文件句柄和三个参数open,它会更好。