0
「我試圖用」#EXECUTE函數名。後跟散列值「替換」EXECUTE函數名「的每一個出現」只有當函數名存在。我的下面的正則表達式似乎並不同意我的看法。「存在」功能,同時檢查存在的哈希值
s/EXECUTE ([\w-]+)\.?/"# EXECUTE $1.\n" . $hash{$1}/eg if (exists($hash{$1}));
請指教。
「我試圖用」#EXECUTE函數名。後跟散列值「替換」EXECUTE函數名「的每一個出現」只有當函數名存在。我的下面的正則表達式似乎並不同意我的看法。「存在」功能,同時檢查存在的哈希值
s/EXECUTE ([\w-]+)\.?/"# EXECUTE $1.\n" . $hash{$1}/eg if (exists($hash{$1}));
請指教。
嗯,你的代碼執行的實際正則表達式前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;
這是殘酷的輝煌..! :-) 萬分感謝! – Spooferman
恩,另一個perl的魔法:D – gaussblurinc