在 ns2 中,我使用声明了一个简单的数组
array set ktree {}
然后我尝试将其用作 GOD 变量
create-god $ktree
但这给出了错误
can't read "ktree": variable is array
while executing
"create-god $ktree {}"
任何帮助是极大的赞赏。
在 Tcl 中,$varName
表示“<em>从名为 的变量中读取varName
”并且不是对变量的一般引用(与其他一些语言不同,特别是 Perl 和 PHP,它们做的事情完全不同)。从整个数组而不是该数组的一个元素中读取,在 Tcl 中总是一个错误。
要将数组传递给命令,请传入该数组的名称。然后由该命令根据需要访问它。对于用 Tcl 编写的过程和方法,它通常涉及upvar
将数组链接到本地视图。(直接用 C 或 C++ 编写的东西的限制要少得多,因为它们不会自动推送 Tcl 堆栈帧。)
但是请注意,当您传入该名称时,该命令必须期待该数组的名称。(当然,优秀的程序员会记录这一事实。)是否create-god
有,我真的不知道;它不是一般的 Tcl 命令,而是更具体的命令。(ns2 的一部分?或者你自己的代码。)
按名称传入数组的一个例子是parray
应该成为每个 Tcl 发行版一部分的命令。这是一个打印数组的过程。这是没有一些样板注释的源代码:
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 代码。