2016-05-15 1 views
1

Ich habe eine Liste in meiner Anwendung, die ich auf .. arbeiten Sein im Allgemeinen wie folgt aus:Warum verschwinden Sonderzeichen in meiner Variablen beim Ausführen eines Lindex in TCL?

$item = {text1 text2 text3} 

Dann nehme ich in der Liste das erste Element nach oben mit:

lindex $item 0 

Auf diese text1 tun was früher (sagen wir) abcdef\12345 war, wird abcdef12345. Aber es ist sehr wichtig für mich, diese \ nicht zu verlieren. Warum verschwindet es? Es gibt andere Zeichen wie und >, die nicht verschwinden. Bitte beachten Sie, dass ich dem \ im Text nicht zuvor entkommen kann. Wenn es etwas gibt, was ich tun kann, bevor ich mit der $item mit arbeite, bitte schlagen Sie vor.

Antwort

1

Das Problem ist, dass \ ein Metasyntax Charakter Tcl-Liste ist, anders als , > oder beliebige alphanumerische Zeichen.Sie müssen Ihre Zeichenfolge in eine ordnungsgemäße Tcl-Liste konvertieren, bevor Sie lindex (oder eine andere listenintensive Operation) darauf verwenden. Um das zu tun, müssen Sie verstehen genau was Sie bedeuten durch "Wörter" in Ihren Eingabedaten. Wenn Ihre Eingabedaten ein Sequenz von nicht-Leerzeichen getrennt durch einzelne Leerzeichen sind, können Sie split verwenden, um die Umwandlung in eine Liste zu tun:

set properList [split $item] 
# Now we can use it... 
set theFirstWord [lindex $properList 0] 

Wenn Sie einen anderen Separator haben, split ein optionales nehmen Extra-Charakter, um zu sagen, was zu teilen ist. Zum Beispiel aufzuspalten von Doppelpunkten (:) Sie tun:

set properList [split $item ":"] 

Wenn Sie jedoch andere Arten von Spaltung Regeln haben, ist dies nicht so gut funktioniert. Zum Beispiel, wenn Sie mit dem mehrere Leerzeichen aufteilen können, dann ist es tatsächlich besser regexp zu verwenden (mit den -all -inline Optionen) die Wort-Identifikation zu tun:

# Strictly, this *chooses* all sequences of one or more non-whitespace characters 
set properList [regexp -all -inline {\S+} $item] 

Sie auch Aufspaltung von Multi-Zeichenfolge zu tun In diesem Fall ist es am einfachsten, die Multi-Zeichen-Sequenz (mit string map) zuerst auf ein einzelnes seltenes Zeichen abzubilden. Unicode bedeutet, dass es viele solcher Zeichen ist ...

# NUL, \u0000, is a great character to pick for text, and terrible for binary data 
# For binary data, choose something beyond \u00ff 
set properList [split [string map {"BOUNDARY" "\u0000"} $item] "\u0000"] 

Noch komplexe Optionen möglich zu holen, aber das ist, wenn Sie splitx von Tcllib verwenden.

package require textutil::split 

# Regular expression to describe the separator; very sophisticated approach 
set properList [textutil::split::splitx $item {SPL+I*T}] 
0

In tcl Listen können auf verschiedene Weise erstellt werden:

durch eine variable Einstellung eine Liste von Werten

set lst {{item 1} {item 2} {item 3}} 

mit dem geteilten Befehl

set lst [split "item 1.item 2.item 3" "."] 

mit dem Befehl list sein .

set lst [list "item 1" "item 2" "item 3"] 

Und ein einzelnes Listenmitglied kann mit dem Befehl lindex zugegriffen werden.

set x "a b c" 
puts "Item 2 of the list {$x} is: [lindex $x 2]\n" 

Dies gibt Ausgang:

Item 2 of the list {a b c} is: c 

und im Hinblick auf die Frage gefragt Sie müssen die Variable wie diese abcdef\\12345

Um definieren, diese klaren Versuch zu machen, die laufen folgenden Befehl.

puts "\nI gave $100.00 to my daughter." 

und

puts "\nI gave \$100.00 to my daughter." 

Der zweite wird Sie das richtige Ergebnis.

Wenn Sie den Text nicht ändern können, versuchen Sie, den Text in geschweiften Klammern zu speichern, wie im ersten Beispiel erwähnt.

set x {abcd\12345} 
puts "A simple substitution: $x\n" 

Ausgang:

A simple substitution: abcd\12345 

set y [set x {abcdef\12345}] 

Und für diesen Ausgang:

puts "Remember that set returns the new value of the variable: X: $x Y: $y\n" 

Ausgang:

Remember that set returns the new value of the variable: X: abcdef\12345 Y: abcdef\12345 
+0

Gut danke für die Info. Aber meine Frage ist anders. – user2311285

+0

Entschuldigung Irgendwie wurde mein Netzwerk getrennt, Konnte die vollständige Antwort nicht geben. Bitte finden Sie die aktualisierte Antwort. – kvivek

+1

Ja, aber ich habe nicht die Option, das "\" in der Listenvariablen zu umgehen. In der Anwendung, die ich mit dem Benutzer arbeite, wählt einige Text in Form einer Liste aus. Daher habe ich keine Kontrolle über den Inhalt der angegebenen Liste und kann sie nicht ändern. – user2311285

Verwandte Themen