2

好吧,不知道在这方面该怎么做。不久前,我修改了一个 Eggdrop 机器人的日志记录脚本。但现在出现了一个问题,由于某种原因,由于字符大小写问题,它正在将操作/文本记录在单独的文件中。 #channel.html一样存在#Channel.html,尽管前者是由于频道名称的当前状态而被写入的(如果所有用户离开并且一个人以不同的大小写重新加入,它可能会改变)。

我已将这个问题缩小到我认为是问题的范围。 file exists 'filename_here'. 我已经查看了 tcl 的文档,并且我已经阅读了有关混合大小写文件名的 wiki(它当然将它们视为不同的文件),但我还没有找到这样的选项(或用户制作的 proc)允许我禁用此行为。

有没有办法/可以做到这一点?

4

3 回答 3

4

它实际上取决于文件系统(即操作系统),因为file exists它只是围绕操作系统的基本文件存在测试的一个薄包装器。经典的 Unix 文件系统大多区分大小写,而 Windows 文件系统通常不区分大小写。这意味着通常最好在编写代码时小心处理事情的情况;您可能应该考虑string tolower在预期的情况下使用来获取频道名称(因为我认为 IRC 频道名称不区分大小写)。

但是如果你不能这样做,你能做的最好的就是获取不区分大小写匹配的文件名列表,并检查它是否是一个值。唉,这是一个混乱的操作,因为glob没有-nocase选项(很少有人想要这样的东西),所以我们需要使用string match -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!
}

lmap从 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!
}
于 2013-03-05T09:17:18.017 回答
1

选择文件名大小写(#channel.html、#Channel.html 或 #CHANNEL.HTML)并分别在 上使用string tolowerstring totitlestring toupperfilename_here。然后将该值用于所有文件操作。

于 2013-03-05T09:24:53.060 回答
0

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

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

在返回多个文件名的情况下,可以在上面的 lsearch 结果上使用llength进行健全性检查来标记错误。

于 2019-04-06T14:16:01.640 回答