我已经更改了内置unknown
程序的TCL。我已将重命名为unknown
至_unknown
,并在新的未知程序中执行一些自定义检查。问题是它停止了comamnd。当我设置一个数组,然后进行parray时,它会打印消息invalid command name "parray abc"
以下是代码
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 :(得分: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(或更早)使用秒。