2011-11-27 50 views
0

Emacs是一個行之後混亂的語法像

fileparse($file, qr"\.[^.]+$"); 

,並認爲該文件的其餘部分是一個字符串。我該如何解決?

+4

這不是因爲Perl正則表達式,而是由於您選擇的模式標記。只要堅持使用標準的'/',除非你的模式中有'/',否則你的代碼很容易被其他人閱讀。 「醫生,當我像這樣向後彎曲我的手臂時,它會感到疼痛。」 「那麼,不要那樣彎曲你的手臂!」 –

+0

你使用'cperl-mode'(如果不是你應該的)?它不會讓我在Emacs 24上感到困惑。 –

+0

@IvanAndrus不知道:P – tekknolagi

回答

3

Emacs被qr表達式中的引號混淆。標準正則表達式分隔符(/)的工作原理如下:

fileparse($file, qr/\.[^.]+$/); 

事實上,幾乎其他任何東西似乎都起作用。

fileparse($file, qr{(\.[^.]+$/}); 
fileparse($file, qr*\.[^.]+$*); 
fileparse($file, qr#\.[^.]+$#); 

我的版本的VIM不會被引號混淆,但我知道老版本的VIM做了。放置引號是非常令人困惑的,因爲它使qr表達式看起來像一個字符串(它不是)。在正則表達式中使用引號作爲分隔符通常是不好的策略,儘管它在技術上是合法的。

但是,真正重要的問題是什麼fileparse?這不是標準的Perl函數。我假設這是從File::Basename導入的?這是正確的嗎?

根據我的文檔,fileparse中的第二個參數假設爲數組而不是引用的正則表達式。

+0

*如果給出'@ suffixes',每個元素都是一個模式(或者一個字符串或一個'qr //'), '$ filename'。*因此,OP有一個由單個元素組成的後綴列表。沒有錯。 –

+1

emacs如何使用'''作爲分隔符?這是用於防止插值的一種。我無法檢查,因爲Emacs嚇倒了我的bejesus :-P –

3

David W.可能有正確的答案。同樣,最好避免使用"作爲分隔符,但有時您需要使用'作爲分隔符來防止插值,因此這可能對此情況下的某個人有用。使用一個也是如此嚴重

fileparse($file, qr"\.[^.]+$"); #"# highlight fix 

一個例子:

因此,如果由於某種原因,你真正想要的報價分隔符(或防止使用'插值),你總是可以做這樣的事情

s'hi'by'; #'# highlight fix 

注意:第二個#用於在編輯器中觸發註釋高亮顯示,以便highlight fix顯示爲註釋。