Tcl 如何在列表中搜索始终匹配
我想从列表中搜索匹配项。我有一个例子:Tcl 如何在列表中搜索始终匹配,tcl,eggdrop,Tcl,Eggdrop,我想从列表中搜索匹配项。我有一个例子: blabla.aa cc.oiwerwer asfd.Dd.asoiwer 我想检查它是否在列表中,大写字母应该被忽略 bind pub "-|-" !tt tt proc tt {nick host handle channel arg} { set name [lindex [split $arg] 0] set groups {aa BB Cc DD Ee Ff gg hh} if {[lsearch -inline $
blabla.aa
cc.oiwerwer
asfd.Dd.asoiwer
我想检查它是否在列表中,大写字母应该被忽略
bind pub "-|-" !tt tt
proc tt {nick host handle channel arg} {
set name [lindex [split $arg] 0]
set groups {aa BB Cc DD Ee Ff gg hh}
if {[lsearch -inline $groups $name] != -1} {
putnow "PRIVMSG $channel :match name $name"
}
}
无论我写什么,它总是说匹配
关于您为lsearch指定了-inline参数。它返回匹配项或空字符串。所以,它总是不等于-1。尝试删除-inline参数。另外,您可能希望使用-exact参数
参考资料:如果我理解正确,您想知道列表组中是否有任何元素与目录名称示例相匹配。如果是这样,那么您应该使用一个循环:
如果您可以将列表中的所有内容都安排在一种情况下,例如小写,那么您可以使用[string tolower]和in运算符进行搜索。这比lsearch更简单,因为它生成一个干净的二进制结果:
proc tt {nick host handle channel arg} {
set name [lindex [split $arg] 0]
set groups {aa bb cc dd ee ff gg hh}
if {[string tolower $name] in $groups} {
putnow "PRIVMSG $channel :match name $name"
}
}
您的问题有点不清楚,但拼凑一些线索,您可能希望:
set channels {
blabla.aa
cc.oiwerwer
asfd.Dd.asoiwer
}
set groups {aa BB Cc DD Ee Ff gg hh}
foreach group $groups {
set idx [lsearch -nocase $channels "*$group*"]
if {$idx != -1} {
puts "$group -> [lindex $channels $idx]"
}
}
哪个输出
aa -> blabla.aa
Cc -> cc.oiwerwer
DD -> asfd.Dd.asoiwer
或者,更简洁的是:
lsearch -inline -all -nocase -regexp $channels [join $groups |]
当我使用-inline时,只有当$name BB完全匹配时,才是匹配的,使用BB.oiwerwer dont work时,不可能对模板使用简单的lsearch。您应该循环使用$name中的所有组件。例如:foreach part[split$name.]{if{[lsearch-exact$groups$part]!=-1}{putnow PRIVMSG$channel:..;break}}}$arg的值是多少?
lsearch -inline -all -nocase -regexp $channels [join $groups |]
blabla.aa cc.oiwerwer asfd.Dd.asoiwer