在 Tcl 代码中,我可以在 foreach 中迭代列表时附加和排序列表吗
In Tcl code, can I append and sort a list while I am iterating over it in foreach
我已经在 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
明确)。
我已经在 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
明确)。