星期三, 6月 21, 2006

Perl Script

今天用某同事寫的perl script,遇到一個得意的問題

他的script裏面有一句是這樣: if ($line =~ /$rcFile/)
原意是想檢寫某一行裏面有沒有一個file的名稱

但我用起來,卻發現script沒有正常運作
(就是$line裏面有$rcFile所儲的file名稱,但是if起來是false)

後來得另一位同事幫助,才發現原因是這樣:
$rcFile所儲的名稱是"\test"
在if ($line =~ /$rcFile/)這句statement裏,"=~"這個operator會把$rcFile的內容
當作regular expression,於是"\test"便會被當成" est"(第一格是一個tab char)
這個bug是剛巧$rcFile有"\t"或"\n"這類substring才會出現.

解決方法有2:
1. if ($line =~ /\Q$rcFile\E/) 這樣perl便不會把$rcFile當作regular expression.
2. "=~"其實是用作pattern matching,如果想檢查substring,便應該用檢查substring的function,而不是偷懶用"=~"

沒有留言: