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