0

我在谷歌上寻找关于在期望中声明数组但无法找到它的信息。即使该行的 witki链接也是空的。我知道我可以设置数组值,set arr("hh") "hhh"但我如何声明它。

我可以使用一个命令打印整个数组还是必须循环遍历它才能打印所有元素。

或者没有在expect/tcl中声明数组之类的东西。我的意思是我们可以只使用global关键字来访问任何数组。

4

2 回答 2

1

您无需在 Expect(或一般的 Tcl)中声明数组,您只需使用它们即可。但是数组和其他变量确实有作用域。如果您在 proc 中并且想要引用具有全局范围的数组 arr ,您可以global arr在使用它之前说出来,或者在每次使用它时在名称前面加上 :: 前缀,例如。set ::arr(hh) "hhh"; puts $::arr(hh).

有一个命令数组可以打印整个数组,但它是从库脚本加载的,而不是内置的,因此可能不可用,具体取决于您的 Expect 安装方式。例如。

expect1.1> set arr(a) ACBD
ACBD
expect1.2> set arr(b) "BBB bbb"
BBB bbb
expect1.3> parray arr
arr(a) = ACBD
arr(b) = BBB bbb
于 2013-03-08T11:44:45.053 回答
1

您不必声明数组,但如果您想:

array set variableName {}

最后一个词是一个空列表。如果您有一些要存储在数组中的默认值,您可以说:

array set varname {key1 val1 key2 val2 ... ...}

如果你很好奇,这里是如何parray实现的:

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)]
    }
}
于 2013-03-08T13:59:03.317 回答