我正在尝试使用Tcl将值添加到子列表中。通过互联网,我发现最有效的方法是像这样使用lset
:
lset x 0 end+1 $item
但是,我在更大更复杂的范围内遇到了lset
的麻烦。 lset
在过程的内部,该过程从外部获取参考变量以引用列表上的正确位置。我创建了简单的测试脚本以查看它是否可以工作:
set x { {} {} {} }
set refID 1
proc addValue {value} {
global x refID
set value [expr $value*2]
lset x $refID end+1 $value
}
addValue 7
addValue 8
# => {} {14 16} {}
完美运行!但是,当我进入较大的项目时,尽管列表/子列表的设置相同,但我一直在获得“列表索引超出范围”的信息。
set allNodes { {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} }
# Many lines of proc stuff
...
puts "Testing $currentHead $currentHeadID --- $n2 $nd2"
if {$d<40 && $currentHeadID!=$nd2} {
lappend members $nd2
lset allNodes $currentHeadID end+1 $n2
}
...
# continuing
我能够使流程中的所有内容正常工作,并且我知道currentHeadID
是puts
的整数。列表索引如何超出范围?我已经尝试过调整end
以及其他一些内容,但似乎无法弄清楚。
即使我在代码中添加了一个简单的手动测试:
set allNodes { {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} }
lset allNodes 0 end+1 5
# => list index out of range while executing
# "lset allNodes 0 end+1 5"
即使列表索引的构建方式与我的简单过程完全相同,我仍然遇到列表索引问题。这是Tcl版本问题吗?这与通过模拟器运行有关系吗?我在这里想念什么?
答案 0 :(得分:2)
这是Tcl版本问题吗?
是的。从Tcl 8.6(请参阅TIP 331)开始,Tcl通过[lset]
学会了扩展列表,在Tcl 8.5中,您将获得list index out of range
。