问题描述
我在 tcl 中对列表进行了排序,并且正在使用 foreach 对其进行迭代 在迭代期间,我希望将一个项目附加到列表中,并确保该项目按排序顺序位于正确的位置。 像这样:
foreach item $mylist {
..
if { $sun == "shining" } {
set mylist [lsort [lappend mylist "newitem"]]
continue
}
..
}
它在 tcl 中是有效的吗?这在所有情况和情况下都能按预期工作吗?
解决方法
foreach
将在开始迭代之前扩展 $mylist
变量一次:
% set mylist {1 2 3 4 5}
1 2 3 4 5
% foreach item $mylist { puts $item; lappend mylist "$item$item" }
1
2
3
4
5
% set mylist
1 2 3 4 5 11 22 33 44 55
因此,这取决于您说“它是否按预期工作”时的期望
,正如 glenn 建议的那样,您可以使用 while
,其测试条件在列表的状态上表示(例如使用 llength
)。
set mylist {1 2 3 4 5}
while {[llength $mylist]} {
# consume first list element
set mylist [lassign $mylist item]
if {$item <= 5} {
lappend mylist $item$item
}
}
注意 lassign
对使用列表很有用。不用说,仍然说,您需要一些停止条件(例如,列表必须在某个时刻耗尽,或者您明确break
)。