我看了另外两个主题,我仍然遇到问题。以下是导致问题的代码的一部分。
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
并出现相同的错误。
我觉得我错过了一些非常简单的东西,但我尝试过的都没有。
答案 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
}
}
将dt
预先设置为数组意味着您可以轻松找到源文件中某个位置dt
到某个值的位置。如果dt
已经是一个数组,这将导致错误,指出你的位置。
(稍微有点,但仍然值得一提)catch
构造似乎有误导性,因为没有尝试确定文件是否确实存在。通常,最好让初始化失败并显示错误,而不是报告错误并继续。
但是,如果您要做的只是收集$dtList
值的列表,为什么不直接这样做:
if {[llength $fileList] > 0} {
set result [lmap f $fileList {
puts "Sourcing $f..."
source $f
set dtList
}]
}