2012-09-11 65 views
0

「我試圖用」#EXECUTE函數名。後跟散列值「替換」EXECUTE函數名「的每一個出現」只有當函數名存在。我的下面的正則表達式似乎並不同意我的看法。「存在」功能,同時檢查存在的哈希值

s/EXECUTE ([\w-]+)\.?/"# EXECUTE $1.\n" . $hash{$1}/eg if (exists($hash{$1})); 

請指教。

回答

5

嗯,你的代碼執行的實際正則表達式前if -condition,所以你執行你的代碼時可能會得到一個警告。

當直接使用e -modifier您可以在「替換部分」用perl代碼:

s/EXECUTE\s+([\w-]+)\.?/ 
    if(exists($hash{$1})) { 
     "# EXECUTE $1.\n" . $hash{$1} 
    } else { 
     $& 
    }/xeg; 

我已經添加/ X,這樣你就可以格式化正則表達式,使之能讀 - 但現在你必須明確地匹配空格(這就是爲什麼我在EXECUTE和組之間添加了\s+)。 $&代表整個匹配(所以如果沒有$1的散列條目,則不會改變)。


也就是說,使用$&減慢,而無需在整個程序捕獲每場比賽和替代。這是一個改進:

s/(EXECUTE\s+([\w-]+)\.?)/ 
    if(exists($hash{$2})) { 
     "# EXECUTE $2.\n" . $hash{$2} 
    } else { 
     $1 
    }/xeg; 
+0

這是殘酷的輝煌..! :-) 萬分感謝! – Spooferman

+0

恩,另一個perl的魔法:D – gaussblurinc