Tcl “文件存在”命令的非区分大小写版本

Tcl “文件存在”命令的非区分大小写版本,tcl,eggdrop,Tcl,Eggdrop,嗯,我不知道在这方面该怎么办。不久前,我修改了一个eggdrop机器人的日志脚本。。但现在,由于某种原因,出现了一个问题:由于字符大小写的问题,它将操作/文本记录在单独的文件中#channel.html与#channel.html一样存在,但前者是由于频道名称的当前状态而写入的(如果所有用户离开,其中一个用户以不同的大小写重新加入,则会发生更改) 我已经把这个问题缩小到我认为是问题的范围文件存在“filename\u here”。我已经阅读了tcl的文档,也阅读了关于混合案例文件名的wiki(当

嗯,我不知道在这方面该怎么办。不久前,我修改了一个eggdrop机器人的日志脚本。。但现在,由于某种原因,出现了一个问题:由于字符大小写的问题,它将操作/文本记录在单独的文件中
#channel.html
#channel.html
一样存在,但前者是由于频道名称的当前状态而写入的(如果所有用户离开,其中一个用户以不同的大小写重新加入,则会发生更改)

我已经把这个问题缩小到我认为是问题的范围<代码>文件存在“filename\u here”。我已经阅读了tcl的文档,也阅读了关于混合案例文件名的wiki(当然,它将它们视为不同的文件),但我还没有找到允许我禁用此行为的选项(或用户制作的程序)


有没有办法做到这一点?

这实际上取决于文件系统(即操作系统),因为它只是操作系统基本文件存在性测试的一个薄包装。经典的Unix文件系统大多区分大小写,而Windows文件系统通常不区分大小写。这意味着,通常最好编写代码,以谨慎处理事件;您可能应该考虑在预期的情况下使用信道名称(因为我认为IRC信道名称不区分大小写)。 但是如果你不能做到这一点,那么最好的办法就是获取不区分大小写的文件名列表,并检查这是否是一个值。唉,这是一个混乱的操作,因为没有
-nocase
选项(很少有人想要这样的东西),所以我们需要使用来帮助:

set files [lmap f [glob *.html] {
    expr {[string match -nocase ${channel}.html $f] ? $f : [continue]}
}]
if {[llength $files] == 1} {
    set channel_file [lindex $files 0]
} else {
    # Oh no! Ambiguity!
}
使用Tcl 8.6中的;Tcl的早期版本应该使用以下内容:

set files {}
foreach f [glob *.html] {
    if {[string match -nocase ${channel}.html $f]} {
        lappend files $f
    }
}
if {[llength $files] == 1} {
    set channel_file [lindex $files 0]
} else {
    # Oh no! Ambiguity!
}

选择一个文件名大小写(#channel.html、#channel.html或#channel.html)并使用,或分别在
filename\u中使用。然后将该值用于所有文件操作。

可以使用glob上的lsearch过滤器对特定文件名执行不区分大小写的搜索,例如

% lsearch -nocase -all -inline -glob [glob ./*] {*/myfile.txt}
./myFile.txt ./Myfile.txt ./MYFILE.txt

如果返回了多个文件名,可以使用上面的lsearch结果上使用llength的健全性检查来标记错误。

为了澄清,我不怀疑这会起作用,但是我推迟接受,因为我还没有机会尝试实现。