2014-04-04 14 views
1

我已經更改了TCL內置的unknown程序。我已將重命名爲unknown_unknown並且在新的未知過程中執行一些自定義檢查。問題是停止了parma comamnd。當我設置一個數組,然後做粒子陣列它打印消息invalid command name "parray abc"parray在TCL中停止工作

下面是代碼

rename unknown _unknown 
proc unknown args { 
    puts "inside unknwn proc" 
    if { ![regexp {65ABC::\w+\s.*} $args] } { 
     uplevel 1 [list _unknown $args] 
    } else { 
     regexp {(65SABC::\w+)\s+(.*)} $args - procName params 
     regsub {65ABC::} $procName "65ABC8X::" procName 
     eval "$procName $params" 
    } 
} 

set abc(1) one 
parray abc 

inside unknwn proc 
invalid command name "parray abc" 
+0

我無法重現您的代碼...即使重命名爲'未知',我也能'parray'工作得很好。 – Jerry

+0

有你推出新的shell或者將代碼粘貼在同一個shell中 – Nitesh

+0

也無法重現錯誤。我認爲你的代碼中其他東西一定是錯的。 –

回答

3

問題是這樣的:

uplevel 1 [list _unknown $args] 

由於強制的參數傳遞給整個列表被解釋爲一個單一的論點。因此怪異的命令名稱。 確切地說,問題是你最後調用的東西等於uplevel 1 {_unknown {parray abc}}而不是uplevel 1 {_unknown parray abc}(這是你真正想要調用的東西)。 Tcl通常非常精確地關於單詞邊界和錯誤消息;他們會仔細地告訴你,如果你仔細閱讀,會發生什麼問題。

應該是這些一個

uplevel 1 [list _unknown {*}$args] 
uplevel 1 _unknown $args 

傾向於第一種,如果你正在使用8.5或8.6;使用8.4(或更早)的第二個。

+0

這是行得通的。我已經使用了第二個選項。如果你讓我知道爲什麼解決方案正常工作,那將是很好的 – Nitesh

+0

爲什麼我們沒有得到這個錯誤?爲什麼「unknown」被首先調用? –

+0

@Nitesh對不起,以前的簡短答案;我剛剛在這裏開會。 ;-) –