2

さて、これに関して何をすべきかわからない。少し前に、eggdrop ボットのロギング スクリプトを変更しましたが、現在、何らかの理由で、大文字と小文字の問題により、アクション/テキストが別のファイルに記録されているという問題が発生しています。 #channel.htmlと同様に存在し#Channel.htmlますが、チャネル名の現在の状態のために前者が書き込まれます (すべてのユーザーが離れて、​​別のケースで 1 人が再参加すると変更される可能性があります)。

私はこの問題を、私が問題であると信じているものに絞り込みました。 file exists 'filename_here'. 私はtclのドキュメントに目を通し、大文字と小文字が混在するファイル名に関するwikiを読みました(もちろん、それらは異なるファイルとして扱われます)が、許可するようなオプション(またはユーザーが作成したproc)をまだ見つけていませんこの動作を無効にします。

これを回避する方法はありますか?

4

3 に答える 3

4

file existsこれは、OSの基本的なファイル存在テストの単なる薄いラッパーであるため、実際にはファイルシステム(つまりOS)に依存します。従来のUnixファイルシステムではほとんどの場合大文字と小文字が区別されますが、Windowsファイルシステムでは通常大文字と小文字が区別されません。これは、通常、物事のケースの処理に注意するようにコードを作成するのが最善であることを意味します。予想されるケースでチャネル名を取得するために使用することを検討するstring tolower必要があります(IRCチャネル名では大文字と小文字が区別されないと思うため)。

ただし、それができない場合は、大文字と小文字を区別せずに一致するファイル名のリストを取得し、それが単一の値であるかどうかを確認するのが最善の方法です。残念ながら、これはオプションglobがないため厄介な操作です(人々がそのようなことを望んでいることはめったにありません)ので、私たちは助けるために使用する必要があります:-nocasestring 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!
}

lmapTcl8.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) を選択し、文字列 tolower文字列 totitleまたは文字列 toupperを でそれぞれ使用しfilename_hereます。次に、その値をすべてのファイル操作に使用します。

于 2013-03-05T09:24:53.060 に答える