2013-10-29 38 views
0
提供的正則表達式列表

所以,我需要解析文件,如果發生匹配的模式,用什麼替代它:的Perl:如何從文件

while(<$ifh>) { 
    s/(.*pattern_1*)/$1\nsome more stuff/ ; 
    s/(.*pattern_2*)/$1\neven more stuff/; 
    s/(.*pattern_3.*)// ; 
    # and so on ... 
    print $ofh $_; 
} 

問:什麼是有這個正則表達式一個最簡單的方法規則列表中的文件(類似於sed'-f'選項)?

編輯:也許我需要澄清一點。我們需要在單獨的文件中有正則表達式規則(不在解析文件中 - 雖然這很好,謝謝!),所以它們不是硬編碼的。所以,基本上外部文件應該由'//'行組成。 當然,這可以用foreach循環和eval來完成,甚至可以通過外部調用sed來完成,但是我想可能會有更好的東西。

問候,WOJTEK

+1

也許你應該解釋爲什麼你不想在你的程序文件中有正則表達式。我假設儘管你說要在「文件」中使用正則表達式,但實際上這意味着你需要爲它們添加第三個文件,以便你有程序文件,輸入文件和正則表達式文件。 – TLP

回答

0

您可以創建模式,並將它們存儲在一個Perl的名單,然後只需通過你在你的輸入迴路模式重複。

my @patterns = (qr/pattern1/, qr/pattern2/, qr/pattern3/, etc..); 
while(<$ifh>) { 
    for my $pattern (@patterns) { 
     s/($pattern)/$1\neven more stuff/; 
    } 
    print $ofh $_; 
} 
0

根據您的編輯,這裏有一種將正則表達式存儲在外部文件中的方法。請注意,我不建議將整個s/.../.../語句存儲在外部文件中,但可以使用eval函數來完成它。這是我會怎麼解決這個問題,但是:

my (@regexes,$i); 
$i=0; 
while (my $line=<$rifh>) { 
    chomp($line); 
    if (index($line, "::")>-1) { 
    my @texts=split(/::/,$line); 
    $regexes[$i]{"to find"} = qr!$texts[0]!; 
    $regexes[$i]{"replace with"} = $texts[1]; 
    $i++; 
    } 
} 

while (my $line=<$ifh>) { 
    chomp($line); 
    foreach my $regex (@regexes) 
    $line ~= s!$regex->{"to find"}!$regex->{"replace with"}!; 
    print $ofh $line . "\n"; 
} 

(我使用的!作爲一個正則表達式分隔符是我自己的風格機制,常常是有用的,以允許裸/文字直接在正則表達式定義中使用。)

+0

這或多或少是我的預期。非常感謝! – gucio17