0

私は、expectで配列を宣言することについて、グーグルで情報を探していますが、それを見つけることができません。行のwitkiリンクでさえ空です。のような配列値を設定できることは知っていますset arr("hh") "hhh"が、どのように宣言すればよいですか。

1つのコマンドを使用して配列全体を印刷できますか、それともすべての要素を印刷するために配列をループする必要がありますか。

または、expect / tcl.iで配列を宣言するようなことはありません。つまり、globalキーワードを使用するだけで任意の配列にアクセスできます。

4

2 に答える 2

1

Expect (または一般的な Tcl) では配列を宣言せず、それらを使用するだけです。ただし、配列やその他の変数には有効範囲があります。proc 内にいて、グローバル スコープを持つ配列 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
于 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 に答える