Tcl 如何在匹配后从列表中提取元素?

Tcl 如何在匹配后从列表中提取元素?,tcl,Tcl,我有一个变量和一个列表,如下所示 set check a7 我想要一个列表,其中包含a7之后的所有元素: a8 a9 a10 我该怎么做?“元素列表”已排序 谢谢。您没有指定如果“check”元素不在列表中会发生什么。因为您指出列表已排序,所以我假设您仍然需要位于搜索元素之后的元素 set check a7 set element_list "a1 a2 a3 a4 a5 a6 a7 a8 a9 a10" set last [lsearch -bisect -dictionary -exac

我有一个变量和一个列表,如下所示

set check a7
我想要一个列表,其中包含a7之后的所有元素:

a8 a9 a10
我该怎么做?“元素列表”已排序


谢谢。

您没有指定如果“check”元素不在列表中会发生什么。因为您指出列表已排序,所以我假设您仍然需要位于搜索元素之后的元素

set check a7
set element_list "a1 a2 a3 a4 a5 a6 a7 a8 a9 a10"
set last [lsearch -bisect -dictionary -exact $element_list $check]
puts [lreplace $element_list 0 $last]

lsearch的对分选项将返回元素小于或等于模式的最后一个索引。然后,可以使用lreplace删除索引中的所有内容。即使“check”位于第一个元素之前,该选项也能正常工作。

手动搜索页面表明-bisect选项意味着-sorted,但没有提到-exact是否也是如此。我无法想象-bisect对-glob或-regexp匹配做了什么有用的事情,但为了安全起见,我只是添加了-exact。最后一行的另一个替代方法是:
put[lrange$element\u list$last+1 end]
,即使这不是perl,TIMTOWTDI。我一直认为,指数的M+N形式在性能方面不是最优的。编写
[expr{$last+1}]
实在是太多的工作了。这就是为什么我选择了
lreplace
而不是
lrange
。但两者都会起作用。
set check a7
set element_list "a1 a2 a3 a4 a5 a6 a7 a8 a9 a10"
set last [lsearch -bisect -dictionary -exact $element_list $check]
puts [lreplace $element_list 0 $last]