在ns2中,我使用
声明了一个简单的数组array set ktree {}
然后我尝试将它用作GOD变量
create-god $ktree
但这会产生错误
can't read "ktree": variable is array
while executing
"create-god $ktree {}"
非常感谢任何帮助。
答案 0 :(得分:1)
在Tcl中,$varName
表示“从名为varName
的变量中读取”并不是对变量的一般引用(与其他一些语言不同,特别是Perl和PHP ,做不同的事情)。从整个数组中读取,而不是该数组的元素,在Tcl中始终是一个错误。
要将数组传递给命令,请传入该数组的名称。然后由该命令根据其认为合适的方式访问它。对于用Tcl编写的过程和方法,通常需要upvar
将数组链接到本地视图。 (直接用C或C ++编写的东西的限制要少得多,因为它们不会自动推送Tcl堆栈帧。)
但是请注意,当您传入该名称时,命令必须期待数组的名称。(当然,优秀的程序员会记录这个事实。)create-god
是否支持,我真的不知道;它不是一般的Tcl命令,而是更具体的东西。 (ns2的一部分?或者也许是你自己的代码。)
按名称传入数组的示例是parray
命令,该命令应该是每个Tcl分发的一部分。这是一个打印出阵列的程序。这是source code没有几个锅炉评论:
proc parray {a {pattern *}} {
upvar 1 $a array
if {![array exists array]} {
error "\"$a\" isn't an array"
}
set maxl 0
set names [lsort [array names array $pattern]]
foreach name $names {
if {[string length $name] > $maxl} {
set maxl [string length $name]
}
}
set maxl [expr {$maxl + [string length $a] + 2}]
foreach name $names {
set nameString [format %s(%s) $a $name]
puts stdout [format "%-*s = %s" $maxl $nameString $array($name)]
}
}
这里的关键是我们首先看到upvar 1
将调用者中的命名变量绑定到局部变量,并使用array exists
进行测试以查看用户是否确实传入了一个数组(以便给出一个好的错误信息而不是一个垃圾信息。其他一切只是实现如何实际打印关联数组(找出最大键长度和做一些格式化输出);它只是简单的Tcl代码。