2017-08-09 31 views
0

鑑於格式的文件後:解析一行在文件中的匹配模式在Perl腳本

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

我想打開此文件,一行行讀它,找到它來後occurence VAR3模式Baz並從它的perl腳本中取值9。什麼是最好的正則表達式來做到這一點?

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

因此,與正確的正則表達式,我希望這個子返回值9.

+0

「Baz。*?var3 =(\ d +)」可能有效,但您需要確保點符合換行符。你到目前爲止嘗試過哪些正則表達式? – Secespitus

+1

你不能像你所要求的正則表達式。當模式在不同的行上時,您可以逐行進行。當您找到帶有「Baz:」的行時設置一個標誌,當您找到另一個標題(帶有':'而不是'Baz'的行)時取消設置。如果該標誌在'var3'上匹配。或者,將整個文件讀入一個變量,然後就可以進行多行匹配。 – zdim

+0

@Secespitus我認爲「確保'.'匹配換行符」正是問題的要點。你能詳細說明嗎? – Yunnosch

回答

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,它更好。