TCL数组:变量不是数组

时间:2018-03-12 01:56:21

标签: arrays tcl associative-array

我看了另外两个主题,我仍然遇到问题。以下是导致问题的代码的一部分。

if {[llength $fileList] > 0} {
    set iter 1
    foreach f $fileList {
        puts "Sourcing $f..."
        if {[catch {source $f} rc]} {
            puts "file $f exists but unable to source.\nError message: $rc"
            return 1
        }
        array set dt [list $iter $dtList]
        puts $dt($iter)
        incr iter
    }
}

array set dt [list $iter $dtList]导致出现can't read "dt(1)": variable isn't array错误。我来源的每个文件创建一个名为dtList的列表,我只是尝试遍历每个文件,将$dtList列表设置为另一个(此处称为dt的数组),然后稍后在concat上创建一个完整的列表。

我也尝试使用set dt($iter) $dtList并出现相同的错误。

我觉得我错过了一些非常简单的东西,但我尝试过的都没有。

1 个答案:

答案 0 :(得分:1)

我建议你试试这个:

if {[llength $fileList] > 0} {
    array set dt {}
    set iter 1
    foreach f $fileList {
        puts "Sourcing $f..."
        source $f
        array set dt [list $iter $dtList]
        puts $dt($iter)
        incr iter
    }
}
  1. dt预先设置为数组意味着您可以轻松找到源文件中某个位置dt到某个值的位置。如果dt已经是一个数组,这将导致错误,指出你的位置。

  2. (稍微有点,但仍然值得一提)catch构造似乎有误导性,因为没有尝试确定文件是否确实存在。通常,最好让初始化失败并显示错误,而不是报告错误并继续。

  3. 但是,如果您要做的只是收集$dtList值的列表,为什么不直接这样做:

    if {[llength $fileList] > 0} {
        set result [lmap f $fileList {
            puts "Sourcing $f..."
            source $f
            set dtList
        }]
    }