1

我是 Tcl 的新手。我有一个这样的列表:

set list1 {
    dir1
    fil.txt
    dir2
    file.xls
    arun
    baskar.tcl
    perl.pl
}

从该列表中,我只想要以下元素:

dir1
dir2
arun

我试过了regexplsearch但没有运气。

方法一:

set idx [lsearch $mylist "."]

set mylist [lreplace $mylist $idx $idx]

方法二:

set b [regsub -all -line {\.} $mylist "" lines]
4

3 回答 3

1

lsearch 命令有很多选项,其中一些可以帮助使这项任务变得非常简单:

lsearch -all -inline -not $list1 *.*
于 2018-07-13T13:34:58.763 回答
1

如果您做得正确,方法1会起作用。lsearch默认情况下返回单个结果,搜索条件接受 glob 模式。使用.只会寻找等于的元素.。然后你需要一个循环lreplace

set idx [lsearch -all $list1 "*.*"]
foreach id [lsort -decreasing $idx] {
    set list1 [lreplace $list1 $id $id]
}

按降序排序很重要,因为元素的索引会随着您删除元素而改变(还要注意您在代码片段中使用了错误的变量名称)。


如果您使用正确的正则表达式,方法 2 也可以工作:

set b [regsub -all -line {.*\..*} $list1 ""]

但在这种情况下,您可能想要修剪结果。.*将匹配除换行符以外的任何字符。


我可能会lsearch这样使用,这样可以避免更换:

set mylist [lsearch -all -inline -not $list1 "*.*"]
于 2018-07-13T13:37:57.147 回答
1

lmap或者,使用(或使用显式循环)过滤未接受元素的列表foreach

lmap el $list1 {if {[string first . $el] >= 0} {continue} else {set el}}

另请参阅有关过滤列表的相关讨论,例如使用 `lmap` 过滤字符串列表

于 2018-07-13T15:01:30.853 回答