Wenn $ res="Tabelle existiert nicht", was wird der folgende zurückgeben?
%Vor%
Wissen Sie zuerst, dass [list {*}…]
ein Konstrukt ist, das eine Liste der Wörter in den Auslassungspunkten (den Inhalt der res
-Variablen in Ihrem Fall) zurückgibt. Es passiert , dass in Ihrem Fall der Nettoeffekt nichts ist, da die Eingabezeichenfolge tatsächlich auch eine wohlgeformte Liste ist. Das wird dann zu einem einzelnen Argument für das äußere list
und so erhalten wir eine Ein-Element-Liste als Ergebnis, deren Element eine Liste der Wörter Table
, does
, not
und exist
in dieser Reihenfolge enthält , zB {Table does not exist}
.
Die Liste der erweiterten Wortform ist nützlich für die Verkettung von Listen; Der Befehl concat
macht etwas Ähnliches (aber nicht identisch; es gibt einige historische Seltsamkeiten, die in den Befehl concat
involviert sind). Daher würden Sie zwei Listen wie folgt verketten:
Beachten Sie auch, dass die Erweiterung (eingeführt in Tcl 8.5) wahre Syntax ist, was in Tcl eine sehr ungewöhnliche Sache ist. Das {*}
ändert die Art der folgenden Ersetzung, so dass es mehrere Wörter statt nur eins ergibt. Während es möglich ist, ohne es zu tun, ist es tatsächlich bemerkenswert schwierig, richtig zu werden. Zum Beispiel ohne das obige wäre:
Die Einführung der Erweiterung hat die Anzahl der Aufrufe an eval
, die in den meisten Tcl-Codes benötigt werden, stark reduziert (ein Vorteil, da es schwer war, richtig zu schreiben; viele Programmierer waren von der Schwierigkeit überrascht). Dies hat sich in der Praxis mit dem Befehl exec
besonders bewährt; es macht das Arbeiten mit glob
und auto_execok
viel einfacher:
Pfui. Der letzte war ein bisschen verrückt, um in nicht-erweiterter Form zu schreiben, obwohl ich weiß, was ich mache. (Die falsche Version ist falsch, weil sie auseinander fällt, wenn $arg1
Tcl Meta-Zeichen enthält ...)
Es ist auf der Tcl-Handbuchseite dokumentiert. Es wird auf dem Tcl-Wiki diskutiert. Es wurde in die Sprache in TIP 293 eingeführt (sein Vorgänger war TIP 157 , wo Sie lernen können, wie es funktioniert).
Im Wesentlichen wird {*}$res
die Zeichenfolge in ihre durch Leerzeichen getrennten Wörter aufteilen. Also verhält sich [list {*}$res]
genauso wie [split $res]
(in diesem Fall).
Das Endergebnis ist eine Liste mit einem Element, der Liste der Wörter in $ res.
Ja, ich finde diese Konstruktion immer auch lästig. Es wurde als expand bezeichnet und dann wurde es clever in {*} umbenannt (sehr einprägsam!). Jedenfalls habe ich gesehen, dass es verwendet wurde, um eine Liste zu erweitern, um den Listeninhalt verfügbar zu machen.
Siehe dieses Beispiel für eine Idee, wie es funktioniert:
%Vor%