parray停止在TCL工作

时间:2014-04-04 06:58:31

标签: tcl

我已经更改了内置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" 

1 个答案:

答案 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(或更早)使用秒。