Dieses Format der @IF-Anweisung kann in EDT-Prozeduren benutzt werden, um Zeichenfolgen, Zeilennummern oder Ganzzahlen miteinander zu vergleichen. Die Operanden dürfen dabei sowohl explizit (als Literale) als auch über eine Referenz (Zeilennummer bzw. EDT-Variable) angegeben werden.
Trifft die Vergleichsbedingung zu, wird die angegebene Zeichenfolge als Eingabe abgearbeitet. Ist die Bedingung nicht erfüllt, bleibt die Anweisung wirkungslos.
Operation | Operanden | L-Modus |
@IF | { [S] string1 rel string2 |
S | Das Schlüsselwort Beispielsweise werden mit @IF #L1=#L2 die Zeilennummern in | ||||||||||||||
string1, string2 | Die miteinander zu vergleichenden Zeichenfolgen. | ||||||||||||||
line1, line2 | Die miteinander zu vergleichenden Zeilennummern. Es werden nicht die | ||||||||||||||
I | Das Schlüsselwort | ||||||||||||||
int1, int2 | Die miteinander zu vergleichende Ganzzahlen. Es kann jeweils eine ganze (positive oder negative) Zahl oder eine | ||||||||||||||
rel | Legt die Vergleichsrelation fest:
| ||||||||||||||
text | EDT-Anweisung oder Datenzeile. Falls die Bedingung erfüllt ist, wird die Der Operand Wird |
Aus Kompatibilitätsgründen wird die früher mögliche Angabe von GOTO
oder RETURN
ohne Doppelpunkt in Prozeduren weiter unterstützt.
Der Vergleich zweier Zeichenfolgen hängt zum einen vom Zeichensatz ab, in dem die Zeichenfolgen codiert sind, zum anderen von der Länge der Zeichenfolgen (Zeichenfolgen der Länge Null sind zugelassen).
Den beiden Operanden string1
und string2
kann in jedem Fall ein Zeichensatz entsprechend ihrer Herkunft zugeordnet werden. Wenn die beiden so bestimmten Zeichensätze gleich sind, findet der Vergleich in diesem gemeinsamen Zeichensatz binär statt.
Sind die beiden Zeichensätze verschieden, aber beides EBCDIC 7/8-Bit-Zeichsätze, erfolgt der Vergleich wie bisher binär.
Andernfalls werden beide Zeichenketten intern nach UTF16
konvertiert und der Vergleich findet in UTF16
statt.
Nach der ggf. notwendigen Umcodierung werden von links nach rechts die sich entsprechenden Zeichen der beiden Zeichenfolgen miteinander verglichen. Auf diese Weise erreicht man entweder ein ungleiches Zeichenpaar, oder aber das Ende einer oder beider Zeichenfolgen. Für den Fall der Ungleichheit an einer Stelle steht die Ungleichheit der beiden Zeichenfolgen fest. Der EDT interpretiert die beiden ungleichen Zeichen gemäß ihrem
Zeichensatz als Dualzahlen. Größer ist die Zeichenfolge, deren Zeichen die größere Dualzahl darstellt. Wurde kein ungleiches Zeichenpaar gefunden, wird die längere der beiden Zeichenfolgen als die größere betrachtet. Sind beide Zeichenfolgen gleich lang und wurde kein ungleiches Zeichenpaar gefunden, sind die Zeichenfolgen gleich. Sind die beiden Zeichenfolgen unterschiedlich lang, kann also niemals Gleichheit der beiden Zeichenfolgen vorliegen.
Hinweis
Beim Vergleich von Zeilennummern bezeichnen sowohl %+3L
als auch %+3
gültige Zeilennummern. Bei einer nachfolgenden Vergleichsrelation LE
kann das zu Interpretationsschwierigkeiten führen. Deshalb ist es generell empfehlenswert, die mathematischen Zeichen für die Vergleichsrelationen zu benutzen.
Auch wenn man Spaltenangaben beim Operanden string2
verwendet, kann es zu Interpretationsschwierigkeiten mit dem Einleiter des Operanden text
kommen. Es ist bei der Notation in diesen Fällen besondere Sorgfalt auf eine eindeutige Interpretierbarkeit zu legen. Insbesondere ist es Pflicht, die Spaltenangabe mit Doppelpunkt abzuschließen (sonst optional).
Aus Kompatibilitätsgründen wird das von XHCS festgelegte Sortiergewicht beim Vergleich der Zeichen nicht berücksichtigt. Dies gilt auch für Unicode-Zeichensätze. Eine Sortierung, beispielsweise mit dem Programm SORT
, kann also eine andere Reihenfolge liefern als es das Ergebnis einer @IF-Abfrage im EDT nahe legen würde.
Die Verwendung von @IF mit @RETURN als Anweisung außerhalb von Prozeduren führt möglicherweise zur Beendigung des EDT (siehe @RETURN-Anweisung).
Beispiel 1
4. @PRINT 1.0000 BITTE NICHT LACHEN 2.0000 WEGEN DIESES BEISPIELS 3.0000 BITTE NICHT LACHEN 4. @SET #S0 = 'ERSTE ZEILE = LETZTE ZEILE' 4. @SET #S1 = 'ERSTE ZEILE UNGLEICH LETZTE ZEILE' --------------- (1) 4. @SET #I9 = 2 4. @PROC 3 1. @ @IF S %+#I9 = $-2L : @GOTO 4 ------------------------------- (2) 2. @ @PRINT #S1 N 3. @ @RETURN 4. @ @PRINT #S0 N 5. @END 4. @DO 3 -------------------------------------------------------- (3) ERSTE ZEILE = LETZTE ZEILE 4. @ON 1 DELETE 'NICHT' 4. @DO 3 -------------------------------------------------------- (4) ERSTE ZEILE UNGLEICH LETZTE ZEILE 4.
(1) | Die Zeichenfolgevariablen #S0 und #S1 und die Ganzzahlvariable #I9 werden mit Inhalt versehen. |
(2) | Bei Ausführung der Arbeitsdatei 3 werden an dieser Stelle nicht Zeilennummern, sondern Zeileninhalte miteinander verglichen. |
(3) | Die Ausführung der in Arbeitsdatei 3 abgelegten Anweisungen führt zum Vergleich der Zeilen 3 (%+#I9 ) und 1 ($-2L also 3-2 ). Da die Inhalte dieser beiden Zeilen identisch sind, wird zu der Zeile 4 der Arbeitsdatei 3 verzweigt. |
(4) | Da sich inzwischen der Inhalt von Zeile 1 geändert hat, wird nicht zu der Zeile 4 der Arbeitsdatei 3 verzweigt. |
Beispiel 2
1. @SET #S4 = 'M' ------------------------------------------------ (1) 1. @PROC 4 1. @ @PRINT #S4 N ------------------------------------------------ (2) 2. @ @CREATE #S4: 'M',#S4 3. @ @IF #S4 < 'M'*8 : @GOTO 1 4. @END 1. @DO 4 M MM MMM MMMM MMMMM MMMMMM MMMMMMM 1.
(1) | Die Zeichenfolgevariable #S4 erhält das Zeichen M als Inhalt. |
(2) | In Arbeitsdatei 4 wird folgende Prozedur eingegeben: Der Inhalt von #S4 soll ausgegeben werden. Danach soll vor den momentanen Inhalt von #S4 der Buchstabe M gestellt werden. |
Für den Fall, dass der Inhalt von #S4
kleiner als MMMMMMMM
ist, soll wieder von vorne begonnen werden.
Beispiel 3
9. @PRINT 1.0000 ABC 2.0000 WER 3.0000 ABC 4.0000 WILL 5.0000 ABC 6.0000 HIER 7.0000 ABC 8.0000 MITMACHEN? 9. @PROC 6 1. @ @IF ! <> 'ABC' : @GOTO 3 ------------------------------------ (1) 2. @ @CREATE !: '*' * 20 3. @ @CONTINUE 4. @END 9. @DO 6,!=%,$ --------------------------------------------------- (2) 9. @PRINT 1.0000 ******************** 2.0000 WER 3.0000 ******************** 4.0000 WILL 5.0000 ******************** 6.0000 HIER 7.0000 ******************** 8.0000 MITMACHEN? 9.
(1) | In der Arbeitsdatei 6 werden die Zeilennummern über den Schleifenzähler ! angesprochen. Sollte der Inhalt der gerade über den Zähler ! angesprochenen Zeile von ABC verschieden sein, soll sich an diesem Zeileninhalt nichts ändern. Im anderen Fall soll der Zeileninhalt durch ******************** ersetzt werden. |
(2) | Arbeitsdatei 6 wird ausgeführt. Hierbei sollen alle Zeilen der aktuellen Arbeitsdatei nacheinander durch den Schleifenzähler ! angesprochen werden. |
Beispiel 4
4. @PRINT 1.0000 BITTE NICHT LACHEN 2.0000 WEGEN DIESES BEISPIELS 3.0000 ES IST ZU EINFACH 4. @SET #S0 = 'VERGLEICH POSITIV' 4. @SET #S1 = 'VERGLEICH NEGATIV' -------------------------------- (1) 4. @SET #I9 = 1 4. @PROC 1 ------------------------------------------------------- (2) 1. @ @IF %+#I9 = $-1L : @GOTO 4 ---------------------------------- (3) 2. @ @PRINT #S1 N 3. @ @RETURN 4. @ @PRINT #S0 N 5. @END 4. @DO 1 --------------------------------------------------------- (4) VERGLEICH POSITIV 4. @SET #I9 = 2 4. @DO 1 --------------------------------------------------------- (5) VERGLEICH NEGATIV 4.
(1) | Die Zeichenfolgevariablen #S0 und #S1 werden mit Inhalt versehen. Der Ganzzahlvariablen #I9 wird der Wert 1 zugewiesen. |
(2) | Arbeitsdatei 1 wird geöffnet. |
(3) | Bei einem später gegebenen @DO 1 bewirkt diese Zeile, dass die Zeilennummern Mit Mit Mit |
(4) | Die Prozedur in Arbeitsdatei 1 wird ausgeführt. Zu diesem Zeitpunkt ist die dort genannte Relation %+#I9=$–1L wahr, da 1+1=3–1 wahr ist. |
(5) | Zu diesem Zeitpunkt ist die in der Arbeitsdatei 1 genannte Relation %+#I9=$-1L falsch, da 1+2=3–1 falsch ist. |
Beispiel 5
4. @PRINT 1.0000 BITTE NICHT LACHEN 2.0000 WEGEN DIESES BEISPIELS 3.0000 ES IST ZU EINFACH 4. @SET #L3 = 5 4. @PROC 2 1. @ @IF %+6-#L3 <> $-* : @RETURN -------------------------------- (1) 2. @ @CREATE $+1: 'ODER AUCH NICHT' 3. @ @PRINT 4. @END 4. @$-1 2. @DO 2 --------------------------------------------------------- (2) 2. @1 1. @DO 2 --------------------------------------------------------- (3) 1.0000 BITTE NICHT LACHEN 2.0000 WEGEN DIESES BEISPIELS 3.0000 ES IST ZU EINFACH 4.0000 ODER AUCH NICHT 1.
(1) | Ist bei Ausführung der Arbeitsdatei 2 die hier genannte Relation nicht erfüllt (<> steht für ungleich), wird der Prozedurablauf an dieser Stelle abgebrochen. |
(2) | Die Arbeitsdatei 2 wird ausgeführt. Wegen *=$–1=2 ist die Aussage %+6–#L3<>$–* gleichwertig mit 1+6–5<>3–2 und damit wahr. Deshalb wird die Ausführung der Arbeitsdatei abgebrochen. |
(3) | Zu diesem Zeitpunkt gilt *=1 und somit ist die in Arbeitsdatei 2 stehende Relation %+6–#L3<>$–* falsch, da 1+6–5=3–1 . Deshalb werden auch die restlichen Anweisungen der Arbeitsdatei 2 ausgeführt. |
Beispiel 6
1. @SET #I3 = 1 -------------------------------------------------- (1) 1. @PROC 7 1. @ @IF #I3 > 5 : @RETURN 2. @ @STATUS = #I3 ----------------------------------------------- (2) 3. @ @SET #I3 = #I3+1 4. @ @GOTO 1 5. @END 1. @DO 7 --------------------------------------------------------- (3) #I03= 0000000001 #I03= 0000000002 #I03= 0000000003 #I03= 0000000004 #I03= 0000000005 1.
(1) | Der Ganzzahlvariablen #I3 wird der Wert 1 zugewiesen. |
(2) | Mit der Prozedur in Arbeitsdatei 7 sollen die Werte für die Ganzzahlvariable #I3 solange ausgegeben (@STATUS =#I3 ) und erhöht werden (#I3+1 ), bis zum 1. Mal #I3 einen Wert größer als 5 angenommen hat. |
(3) | Die Arbeitsdatei 7 wird ausgeführt. |