Die Verarbeitung eines Q. Skripts zum Interview läuft in zwei Schritten ab. Ehe das Skript im zweiten Durchlauf inhaltlich ausgewertet wird, erfolgt zuerst eine reine Auflösung sogenannter Präprozessordirektiven. Mit ihnen ist es möglich Skriptbestandteile aus externen Dateien einzubinden, Schablonen anzulegen, um ähnliche Skriptabschnitte zu komprimieren oder Teile des Skripts grundsätzlich nur bedingt zu berücksichtigen.
Dafür stehen die funktionell benannten Befehle
#Include, #Macro und #Define
zur
Verfügung. Sie alle haben gemeinsam, dass sie im
Skript in der ersten Spalte einer Zeile mit dem
Rautenzeichen beginnen. Außerdem besteht die
Möglichkeit, Bereiche im Q. Skript als
Kommentar
zu markieren.
Kommentare in Q. geben Skriptverfassern die Möglichkeit Notizen oder Hinweise zu vermerken, die bei der Verarbeitung des Skripts unberücksichtigt bleiben. Sie lassen sich aber auch nutzen, um ganze Bereiche des Skripts beim Entwickeln oder zum Testen außer Funktion zu setzen.
Ein doppelter Schrägstricht,
//
, kommentiert den Rest der Zeile aus.Block-Kommentare über mehrere Zeilen beginnen mit
/*
und schließen mit*/
// diese Zeile ist eine Kommentarzeile SingleQ dummy; // und auch innerhalb von Zeilen geht das /* und dies ist ein auskommentierter Bereich mit mehreren Zeilen, wobei auch die folgende SingleQ dummy2 nicht mehr eingelesen wird SingleQ dummy2; */
#include "demografie.q"
Mit der Include-Direktive lassen sich Inhalte einer ebenfalls im text-Verzeichnis liegenden Datei einbinden. Die Include-Zeile wird durch den Inhalt der referenzierten Datei ersetzt. Auf diese Art lassen sich lange Fragebögen strukturieren und auf mehrere Dateien verteilen. Zudem können so mehrere Personen gleichzeitig an einem Fragebogen arbeiten. Außerdem lassen sich auf diese Weise auch projektübergreifende, wiederkehrende Skriptteile kapseln und bei Bedarf einbinden. Wie im Beispiel könnte es einen standardisierten Demografieteil geben, der einmal geskriptet und mehrfach benutzt wird.
#define testmode // ... #ifdef testmode HTML{ backbutton = yes; }; #endif
Mit den Define-Direktiven können Skriptzeilen bei der Skriptverarbeitung bedingt berücksichtigt werden.
#define X
aktiviert einen Parameter X, der später als Bedingung verwendet werden kann. Das Aktivieren eines Parameters kann ebenfalls über die Start-URL
des Interviews gesteuert werden.
https://...&define=testmode&define=NOCHEINPARAMETER
Mit #ifdef X
("wenn aktiviert") und
#endif
bzw. #ifndef
X
("wenn nicht aktiviert") und
#endif
kann anschließend ein
Bereich im Skript eingeschlossen werden, der bei der
Skriptverarbeitung nur dann berücksichtigt wird, wenn
Parameter X aktiviert bzw. nicht aktiviert ist.
Mit diesem Mittel lässt sich ein Skript schreiben, das unterschiedliche Varianten eines Fragebogens vorsieht, die über die URL Parameter im Startlink steuerbar sind. Über diesen Mechanismus ließe sich der Fragebogen optional mit bestimmten Einstellungen (Zurückbutton, Tastatureingabe, ...), mit bestimmten Fragenteilen oder im Testmodus (ohne Datenablage, Quotenzählung) starten.
Die aus anderen Programmiersprachen bekannten Verzweigungsmöglichkeiten über #elseif oder #elsif kennt Q. nicht.
Mit #macro X
und
#endmacro
lässt sich ein
Skriptbereich eingrenzen, der für sich allein
funktionslos bleibt. Es handelt sich um eine Vorlage,
die mit &X;
beliebig oft
verwendet (instanziiert) werden kann. Ein solches
Makro lässt sich auch als einfacher Textersatz
verstehen.
// BEISPIEL 1 #macro labellist labels= 1 "sehr gut" 2 "gut" 3 "mittel" 4 "schlecht" 5 "sehr schlecht" ; #endmacro SingleQ spot1; text="Wie gefiel Ihnen der erste Werbespot?"; &labellist;
Beispiel 1 enthält ein Makro
labellist
mit einer Labelliste, die
im Fragebogenverlauf möglicherweise oft wiederkehrt.
Hier ein Makro zu formulieren, spart viel
Schreibarbeit, und bietet auch die Möglichkeit, den
Inhalt an einer Stelle zentral zu pflegen. Wenn die
Skala geändert werden soll, muss sie nur an dieser
einen Stelle umgeschrieben werden.
// BEISPIEL 2 #macro auto_schablone SingleQ auto$Nummer; text="Gefällt Ihnen der $Modell besser als Ihr jetziges Auto?"; labels= 1 "Ja" 2 "Nein" ; flt=($Nummer in modellauswahl); #endmacro &auto_schablone;$Nummer="1";$Modell="VW Passat"; &auto_schablone;$Nummer="2";$Modell="Skoda Oktavia"; &auto_schablone;$Nummer="3";$Modell="Audi A4"; &auto_schablone;$Nummer="4";$Modell="Ford Mondeo";
Wir können ein Makro mit Platzhaltern formulieren, die beim Aufruf durch die eigentlichen Werten ersetzt werden:
&X;ERSATZ1="NEUERTEXT1";ERSATZ2="NEUERTEXT2";...;
Q. ersetzt beim Expandieren des Makros die Platzhalter durch die Werte.
In Beispiel 2 wird das Makro
auto_schablone
verwendet um mehrere
ähnliche Fragen anzulegen. Der Platzhalter
$Modell
sorgt dafür, dass ein
bestimmtes Fahrzeug im Fragetext eingefügt wird,
während der Platzhalter $Nummer
einerseits dafür sorgt, dass die Fragen eindeutige
Namen bekommen und andererseits gefiltert abgefragt
werden. Der benutzte Filter setzt voraus, dass es eine
Frage modellauswahl
gibt, die eine
Fahrzeugvorselektion mit entsprechend nummerierten
Labels gibt.
Als Platzhalter kann streng genommen jeder beliebige Text verwendet werden. Der im Beispiel verwendete Platzhalter »$Modell« würde im Text der Frage »auto1« durch »VW Passat« ersetzt. Es ist unbedingt empfehlenswert Platzhalter in einer beliebigen, genormten Form kenntlich zu machen. Man könnte, wie hier, die Platzhalter z.B. immer mit dem Dollarzeichen beginnen lassen, also »$ERSATZ1« statt »ERSATZ1« schreiben.
Durch Makros lassen sich Skripte oft übersichtlicher, einfacher und schneller erstellen. Makros können allerdings auch schnell kryptisch und unübersichtlich wirken, wenn es zu Verschachtelungen von Makros in Makros mit ähnlichen oder weitergereichten Platzhaltern kommt. Wir raten daher, Makros mit aussagekräftigen Namen zu versehen und sie ausreichend zu kommentieren.
Bitte beachten: Beim Auflösen eines Makros liest Q. Platzhalter Zeichen für Zeichen ein. Das kann bei nummerierten Platzhaltern (z.B. $1) zu Fehlern führen, wenn nicht berücksichtigt wird, dass beim Platzhalter $10 Q. nicht die Zahl 10 berücksichtigt, sondern erneut p1 erkennt und daran eine 0 anhängt.
Zudem sollten Unix-gewohnte Anwender im Kopf behalten, dass das »$«-Zeichen für Q. nur ein Zeichen ist und nicht wie in der Shell eine gesonderte Bedeutung hat.