嗯,不知道在这方面该做些什么。不久之前,我为eggdrop bot修改了一个日志记录脚本..但是现在一个问题展开了,由于某些原因,由于字符大小写的问题,它将操作/文本记录在单独的文件中。 #channel.html
和#Channel.html
一样存在file exists 'filename_here'
,但前者是由于频道名称的当前状态而写入的(如果所有用户都离开,并且一个用不同的情况重新加入,则可以更改)。
我已将此问题缩小到我认为的问题。 {{1}}。我查看了tcl的文档,并且我已经阅读了关于混合大小写文件名的wiki(当然它将它们视为不同的文件),但我还没有找到允许这样的选项(或用户制作的proc)我要禁用此行为。
有办法解决这个问题吗?
答案 0 :(得分:4)
这实际上取决于文件系统(即操作系统),因为file exists
只是操作系统基本文件存在测试的一个薄包装器。经典的Unix文件系统大多区分大小写,而Windows文件系统通常不区分大小写。这意味着通常最好编写代码以小心处理事物的情况;您可能应该考虑使用string tolower
在预期的情况下获取通道名称(因为我认为IRC通道名称不区分大小写)。
但是如果你不能这样做,你可以做的最好的事情就是得到不区分大小写的文件名列表,并检查这是否是单个值。唉,这是一个混乱的操作,因为glob
没有-nocase
选项(人们很少想要这样的事情),所以我们需要使用string match -nocase
帮助:< / p>
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的lmap
;早期版本的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!
}
答案 1 :(得分:1)
选择文件名案例(#channel.html,#Channel.html或#CHANNEL.HTML)并分别在filename_here
上使用string tolower,string totitle或string toupper。然后将该值用于所有文件操作。
答案 2 :(得分:0)
全局上的 lsearch 过滤器可用于对特定文件名执行不区分大小写的搜索,例如
% lsearch -nocase -all -inline -glob [glob ./*] {*/myfile.txt}
./myFile.txt ./Myfile.txt ./MYFILE.txt
在上面的lsearch结果中使用 llength 进行的健全性检查可用于在返回多个文件名的情况下标记错误。