2016-06-01 11 views
0

Ich bin ein Anfänger auf Expect, aber ich kann nicht über ein Problem, das ich mit einem Logging-Monitoring-Skript habe ich schreibe.Tab on Expect Zeichenfolge Verkettung

ich Stunden habe verbrachte googeln, warum ich diese Arbeit nicht bekommen kann:

puts $redirect [concat "${time}\t" "${context}\t" "$id\t" "${eventtype}" "${eventstatus}\t" "${eventcontext}" ] 

Die \ t char (es nicht einmal mit anderen \ Zeichen funktioniert) zeigt sich nicht. Unabhängig davon, wie und wo ich es platzieren, ich habe versucht, verschiedene Sachen:

puts $redirect [concat "${time}" "\t" "${context}" [...] ] 
puts $redirect [concat "${time}\t" "${context}" [...] ] 
puts $redirect [concat "${time}" "\t${context}" [...] ] 
puts $redirect [concat "${time}" \t "${context}" [...] ] 

* wo Umleitung ist set redirect [open $logfile a]

* wo [...] sind andere Saiten ich verketten, in der gleichen Weg.

Von http://tcl.tk/man/tcl8.5/TclCmd/Tcl.htm#M10

[5] Argument Expansion. Wenn ein Wort mit der Zeichenfolge "{}" gefolgt von einem Nicht-Leerzeichen beginnt, wird der führende "{}" entfernt und der Rest des Worts wird geparst und wie jedes andere Wort ersetzt. Nach Substitution wird das Wort als Liste geparst (ohne Befehl oder Variablen Substitutionen; Backslash Substitutionen werden durchgeführt wie normal für eine Liste und einzelne interne Wörter können von entweder Klammern oder doppelte Anführungszeichen umgeben) und seine Wörter werden zu hinzugefügt, wobei der Befehl ersetzt wird. Zum Beispiel ist "cmd a {} {b [c]} d {} {$ e f" g h "} äquivalent zu" cmd a b {[c]} d {$ e} f "g h" ".

[6] Hosenträger. Wenn das erste Zeichen eines Worts eine offene geschweifte Klammer ("{") ist und Regel [5] nicht zutrifft, wird das Wort durch die passende Klammer geschlossen ( geschweifte Klammer ("}")). Klammern verschachteln innerhalb des Wortes: Für jede zusätzliche offene Klammer muss eine zusätzliche Klammer vorhanden sein (wenn jedoch eine offene Klammer oder geschweifte Klammer innerhalb des Wortes mit einem umgekehrten Schrägstrich und dann angegeben wird, wird dies beim Auffinden der passenden Klammer nicht berücksichtigt). Es werden keine Ersetzungen für die Zeichen zwischen den geschweiften Klammern durchgeführt, außer für die umgekehrten Schrägstrich-Newline-Ersetzungen, die unten beschrieben werden, und Semikolons, Zeilenumbrüche, enge Klammern oder Leerzeichen erhalten keine Sonderinterpretation. Das Wort besteht genau aus den Zeichen zwischen den äußeren Klammern, ohne die Klammern selbst.

Ironischerweise kann ich dies funktioniert:

puts $redirect [concat "${time}\n" "-\t${context}" [...] ] 

Wenn ich vor dem TAB ein Zeichen setzen, es funktioniert, aber ich kann es nicht verwenden.

Ex-Ausgang: 2016-06-01 15:43:12 - macro

gewünschte Ausgabe: 2016-06-01 15:43:12 macro

Ich habe mit append auf den Aufbau der Saite versucht, aber es ist wie es ist, Stücke von String aufgrund max Puffer char zu essen, ist es möglich?

Fehle ich etwas? Danke in Beratung.

+0

verwenden Wie ist 'append' Versagen? Gibt es einen Grund, warum Sie hier 'concat' verwenden anstatt nur ein langes String-Literal mit allen darin enthaltenen Variablen' $ {time} \ t $ {context} \ t $ id \ t $ {eventtype} $ {eventstatus } \ t $ {eventcontext} '? Ein Beispiel –

+0

Ausgabe von 'append' ist: 2016-06HANGUPNAVomain-1JUniqueId = JustSrvDomain-1464793190,747 & HangupCause = 16e = Hangup & SphereGroup = & NextSphereName = Hangup 2016.06.01 17: 00: 0058ledNum = 13666 2016.06.01 16.59 : 55 Es ist durcheinander, es setzt die Zeit am Ende, der Kontext ist nirgends, "Omain-1" ist ein Teil von $ ID und auf .., Ich habe die Zeichenfolge verwendet, die Sie mir auf diesem ein. – Ticcio

+0

Das sieht fast so aus, als hätten Sie Carriage-Return-Zeichen ('\ r') in den Werten, so dass die Ausgabe (an das Terminal) sich selbst überschreibt (oder etwas ähnliches mit tcl). Sind Sie sicher, dass die Strings genau die Werte enthalten, die Sie erwarten? –

Antwort

2

Das ist, was concat tut. Es isst Leerzeichen.

Aus der Dokumentation für concat:

schließt sich diesem Befehl jedes seiner Argumente zusammen mit Leerzeichen nach von jedem von ihnen vorderen und hinteren white-space Trimmen. Wenn alle Argumente Listen sind, hat dies den gleichen Effekt wie sie in einer einzigen Liste zu verketten. Es erlaubt eine beliebige Anzahl von Argumenten; Wenn keine Argumente angegeben werden, ist das Ergebnis eine leere Zeichenfolge.

0

@Etan gab Ihnen, warum es nicht für Sie arbeitet.

Eine alternative Möglichkeit, das zu codieren ist format

puts $redirect [format "%s\t%s\t%s\t%s%s\t%s" $time $context $id $eventtype $eventstatus $eventcontext]