2013-03-05 52 views
2

那麼,不知道在這方面做什麼。前一段時間,我修改了一個eggdrop bot的日誌腳本..但現在出現了一個問題,出於某種原因,由於字符大小寫問題,它在單獨的文件中記錄操作/文本。 #channel.html#Channel.html一樣存在,儘管前者是由於通道名稱的當前狀態而寫入的(如果所有用戶都離開並且一個用不同情況重新加入,它可能會更改)。非區分大小寫的文件存在命令

我已經把這個問題縮小到我認爲是問題的地步。 file exists 'filename_here'。我已經瀏覽了tcl的文檔,並且我已經閱讀了關於混合大小寫文件名的wiki(當然,它將它們視爲不同的文件),但我還沒有找到允許這樣的選項(或用戶製作的proc)我禁用此行爲。

有沒有辦法解決這個問題?

回答

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! 
} 
+0

爲了澄清,我沒有任何懷疑,這將工作,但是我堅持接受,因爲我還沒有機會嘗試實施。 – Daedalus 2013-03-06 08:02:40

+0

終於有機會測試它,它工作:) – Daedalus 2013-03-09 09:20:39