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