给定格式的文件:
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。
答案 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
,它会更好。