如何声明特定变量是一个数组?

时间:2013-03-08 10:57:49

标签: expect

我正在寻找谷歌关于在期望中声明数组但无法找到它的信息。即行的link为空。 我知道我可以设置像set arr("hh") "hhh"这样的数组值,但我如何声明它。

我可以使用一个命令打印整个数组,或者我必须遍历它以打印所有元素。

或者没有在expect / tcl.i中声明数组这样的事情意味着我们可以访问任何数组 只需使用global关键字。

2 个答案:

答案 0 :(得分:1)

您不要在Expect(或通常为Tcl)中声明数组,只需使用它们即可。 但是数组和其他变量确实有范围。如果你在一个过程中,并希望 引用具有全局范围的数组arr,您可以先说global arr 使用它或在每次使用时使用::前缀名称,例如。 set ::arr(hh) "hhh"; puts $::arr(hh)

有一个命令parray用于打印整个数组,但这是从库脚本加载而不是内置的,因此可能无法使用,具体取决于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

答案 1 :(得分: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)]
    }
}