2

リストのメンバーを読み取ろうとしているときに問題が発生しました。次のような\\server\directory 問題が発生しました。コマンドを使用してこの変数を取得しようとすると問題が発生しlindex、TCL 置換が行われるため、結果は次のようになります。

\serverdirectory

次に、バックスラッシュ置換を回避するコマンドを使用する必要があると思いますregsubが、正しい手順が得られませんでした。

私が欲しいものの例は次のとおりです。

set mistring "\\server\directory"
regsub [appropriate regular expresion here]
puts "mistring: '$mistring'"  ==> "mistring: '\\server\directory'"

私はこれに関するいくつかの投稿を確認しましたが、問題はありませんが、ここに来る可能性のある他の文字が\\常に単一の後に続くようにしようとすると、まだ問題があります.\

更新: 具体例。私が実際に維持しようとしているのは、リスト内の要素の初期形式です。リストは、外部アプリケーションによって受信されます。元のコードは次のようなものです。

set mytable $__outer_list_received
puts "Table: '$mytable'"
for { set i 0 } { $i < [llength $mitabla] } { incr i } {
   set row [lindex $mytable $i]
   puts "Row: '$row'"
   set elements [lindex $row 0]
   puts "Elements: '$elements'"
}

この場合の出力は次のとおりです。

Table: '{{
   address \\server\directory
   filename foo.bar
}}'
Row: '{
   address \\server\directory
   filename foo.bar
}'
Elements: '
   address \\server\directory
   filename foo.bar
'

そこで\\server\directory、元の形式とデータを維持したまま、構成ファイルに書き込むためにアドレス (この特定のケースでは ) の値を取得しようとしました。これで問題が解決することを願っています。

4

3 に答える 3

0

3 つ目のオプションは、醜いですが、スラッシュを 2 つにすることです。二重引用符を使用している間は、\ の代わりに \\、\ の代わりに \ を使用します。置換が発生すると、必要なものが得られるはずです。もちろん、2 回目の置換を行うと、これはあまり役に立ちません。

于 2013-10-28T01:02:08.930 に答える
0

これは基本的に Windows の問題です (そして、Tcl は常に二重引用符で囲まれたバックスラッシュをエスケープ置換を実行するための指示として扱います)、別のアプローチを検討する必要があります (そうしないと、バックスラッシュを適用できるまでになくなってしまうという問題があります)それらを「修正」するためのコード)。幸いなことに、2 つの選択肢があります。1 つ目は、C# の逐語的な文字列リテラルのように、文字列を{中かっこで囲んで置換を無効にすることです (ただし、代わりにこれを使用します)。2 番目のほうが適切かもしれません。}@""

set mistring [file nativename "//server/directory"]

これにより、プラットフォーム ネイティブのディレクトリ セパレーターが Windows で確実に使用されます (現在、他のプラットフォームでは何もしません。古い MacOS9 がサポートされていた頃は、はるかに魔法のようでした)。通常、この種のものが必要になるのは、ユーザーにフル パス名を表示する場合 (通常は GUI に関しては悪い考えです)、またはスラッシュを好まない API に名前を渡す場合 (特に、経由でプログラムへの引数をexec渡しますが、dde、tcom、または twapi パッケージを使用している場合など、詳細が漏れる他の場所があります)。

于 2013-10-22T08:39:02.150 に答える