2012-07-16 56 views
2

好吧,所以我似乎無法弄清楚這究竟是如何工作的。運行附加代碼時,執行「\ t」(「#」arm line 1)時導致無效的命令名「」「從」switch -regexp - $ line {「(以及基本文件的其餘部分)中調用評論在正則表達式切換語句的上下文中工作

我遇到了這個問題,最後想出了#正在做它,我試着用regsub(如下所示)逃脫它。我可以得到字符串解析的唯一方法是如果我從字符串中刪除#全部(inputString更改爲刪除#號)。

根據TCL以文本(包括命令)讀取所有行的聲明,我只能假定正在讀取的字符串包含#並且無法完成該行,當然返回錯誤。然而,逃避(嘗試1 \和2 \)沒有做任何事情來改善它所做的只是將\添加到所有其他的「非字詞」(我有 - 可以很好地工作,但現在有\ 's ...:S)

如果我刪除或取消註釋掉切換部分{^ [\ t] TEST。 $}的東西工作正常。

我正在修改一個腳本,並忽略了一些特定的情況,並決定將它們註釋掉。

有人可以解釋地球上發生了什麼,我能做些什麼來解決它?看起來.tcl文件仍然是解析#部分,即使它們是註釋,並且變得混亂。

嘗試修復

regsub -all {\W} $line {\\&} line; 

代碼:

proc doConversion fname { 
    set inputString "* |# Bits\n* # Bits \n"; 

    foreach line [split $inputString "\n"] { 
     switch -regexp -- $line { 
       # {^[ \t]*TEST.*$} 
       # { 
        # # Do nothing 
       # } 
       default { 

         } 
      } 
     } 

    } 

doConversion "test" 

更新: 我沒有找到這個資源,這也解釋了(在一定程度上)的意見混亂的性質,但我想我仍然不確定我能做些什麼:"Why can I not place unmatched braces in Tcl comments"

+0

的Tcl的評論機制的本質是這樣的:'#'是僅在預期開始命令的位置發表評論。另外,嵌入式腳本(例如'switch'的武器)可能會導致評論結尾的位置發生變化。這與其他語言不同,它是通用語法規則和Tcl對命令進行遞歸分解的方式的結果。每隔幾年,有人提出「修復」它,但它很難改變,似乎乍一看...... – 2012-07-16 21:30:20

+0

是通過上面鏈接的TCL維基閱讀....這有點混亂.....這是當然。 – onaclov2000 2012-07-16 21:48:55

回答

4

我不是100%清楚你想要做什麼,所以我提前道歉,如果這不能回答你的問題,但:結果是,#不表示評論,除非它是某個地方預期有一個命令。例如,這樣的:

switch -regexp a#b { 
    # { 
     echo 'a#b' contains '#' 
    } 
} 

打印此:

'a#b' contains '#' 

因爲字符串a#b正則表達式#成功匹配。

由於$line包含#,代碼:

 switch -regexp -- $line { 
       # {^[ \t]*TEST.*$} 
       ... 
      } 

將運行這個命令:

^[ \t]*TEST.*$ 

它(因爲方括號中)運行此命令:

\t 

所以你會收到一條錯誤消息告訴你"   "(即製表符)是無效的命令名稱。

如果要禁用switch的一個分支,你關在一個永遠不會被滿足的條件包裝的更好:

proc doConversion fname { 
    set inputString "* |# Bits\n* # Bits \n"; 

    foreach line [split $inputString "\n"] { 
     switch -regexp -- $line { 
       this-regexp-will-never-match { 
        {^[ \t]*TEST.*$} 
        { 
        # # Do nothing 
        } 
       } 
       default { 

         } 
      } 
     } 

    } 

doConversion "test" 
+0

仍然很奇怪(我對該語言不太熟悉),但是從字符串中刪除#(通過#的regsub代替英鎊)似乎可以消除該問題。 – onaclov2000 2012-07-16 20:53:51

+0

此外,我試圖刪除註釋掉的部分,只是爲了看看它是否會工作(在我的更大的程序中),並且仍然不會,所以我不得不求助於#/磅交換。 – onaclov2000 2012-07-16 20:54:45

+0

@ onaclov2000:是的,因爲那麼該字符串不匹配正則表達式'#',所以'switch'永遠不會嘗試運行有問題的命令。 – ruakh 2012-07-16 20:55:22