Funktion
Die PERFORM-Anweisung dient dazu, eine oder mehrere Prozeduren oder eine Reihe von Anweisungen auszuführen.
Forma 1 | gilt für die einmalige Ausführung der angegebenen Prozeduren oder Anweisungen. |
Format 2 | gilt für die Ausführung der angegebenen Prozeduren oder Anweisungen mit einer gegebenen Anzahl von Wiederholungen. |
Format 3 | gilt für die Ausführung der angegebenen Prozeduren oder Anweisungen, die so oft ausgeführt werden, bis eine bestimmte Bedingung erfüllt ist. |
Format 4 | gilt für die Veränderung des Wertes von ein oder mehreren Bezeichnern oder Indexnamen in auf- oder absteigender Folge. Davon abhängig werden eine Reihe von Prozeduren oder die angegebenen Anweisungen ein oder mehrmals ausgeführt. |
Format 1
"out-of-line"
PERFORM prozedurname-1 [{THRU | THROUGH} prozedurname-2]
"in-line"
PERFORM [unbedingte-anweisung END-PERFORM]
Syntaxregeln
Die Wörter THROUGH und THRU sind gleichbedeutend.
Wenn prozedurname-1 und prozedurname-2 angegeben sind und jeweils Namen einer Prozedur innerhalb von Prozedurvereinbarungskapiteln sind, so müssen beide Prozedurnamen innerhalb desselben Prozedurvereinbarungskapitels liegen.
Allgemeine Regeln
END-PERFORM beendet den Gültigkeitsbereich der „in-line“-PERFORM-Anweisung.
Eine „in-line“-PERFORM-Anweisung funktioniert in Übereinstimmung mit den folgenden Allgemeinen Regeln genauso wie eine „out-of-line“-PERFORM-Anweisung, mit der Ausnahme, dass die in einem „in-line“-PERFORM enthaltenen Anweisungen an Stelle der im Bereich von prozedurname-1 (bis prozedurname-2, falls angegeben) stehenden Anweisungen ausgeführt werden. Alle Allgemeinen Regeln gelten für „in-line“- und „out-of-line“-PERFORM gleichermaßen, außer es wird gesondert auf die beiden PERFORM-Arten eingegangen.
Wenn eine PERFORM-Anweisung ausgeführt wird, so geht die Ablaufsteuerung zu der ersten Anweisung der Prozedur über, die mit prozedurname-1 bezeichnet ist. Der implizite Rücksprung zur nächsten ausführbaren Anweisung nach der PERFORM-Anweisung erfolgt folgendermaßen:
Wenn prozedurname-1 ein Paragrafenname und prozedurname-2 nicht angegeben ist, erfolgt der Rücksprung nach der letzten Anweisung von prozedurname-1.
Wenn prozedurname-1 ein Kapitelname und prozedurname-2 nicht angegeben ist, erfolgt der Rücksprung nach der letzten Anweisung des letzten Paragrafen von prozedurname-1.
Wenn prozedurname-2 angegeben und ein Paragrafenname ist, erfolgt der Rücksprung nach der letzten Anweisung des Paragrafen.
Wenn prozedurname-2 angegeben und ein Kapitelname ist, so erfolgt der Rücksprung nach der letzten Anweisung im letzten Paragrafen des Kapitels.
Wird ein „in-line“-PERFORM verwendet, ist die Ausführung der PERFORM-Anweisung nach der letzten in der PERFORM-Anweisung enthaltenen Anweisung abgeschlossen.
Es gibt keine notwendige Verbindung zwischen prozedurname-1 und prozedurname-2, außer dass eine fortlaufende Reihe von Operationen, beginnend bei prozedurname-1, ausgeführt werden soll, die mit der Ausführung der mit prozedurname-2 bezeichneten Prozedur endet. Sogar GO TO- und PERFORM-Anweisungen können zwischen prozedurname-1 und dem Ende von prozedurname-2 auftreten. Wenn es zwei oder mehr logische Wege zum Rücksprungpunkt gibt, kann prozedurname-2 der Name eines Paragrafen sein, der eine EXIT-Anweisung enthält, auf die alle diese Ablaufwege führen müssen.
Die Anweisungen innerhalb einer PERFORM-Anweisung werden einmal ausgeführt, und der Ablauf wird bei der Anweisung fortgesetzt, die der PERFORM-Anweisung folgt.
- Der Bereich einer PERFORM-Anweisung besteht logisch aus all jenen Anweisungen, die infolge der PERFORM-Anweisung ausgeführt werden; dies erfolgt auf Grund des impliziten Übergangs der Ablaufsteuerung zum Ende der PERFORM-Anweisung. Der Bereich schließt alle Anweisungen ein, die als Folge von CALL-, EXIT-, GO TO- und PERFORM-Anweisungen im Bereich einer PERFORM-Anweisung ausgeführt werden; dies gilt ebenso für alle Anweisungen, die im Rahmen von Prozedurvereinbarungen infolge der Ausführung von Anweisungen im Bereich der PERFORM-Anweisung ausgeführt werden. Die Anweisungen im Bereich einer PERFORM-Anweisung müssen nicht aufeinanderfolgend in der Übersetzungseinheit stehen.
Anweisungen, die auf Grund einer EXIT PROGRAM-Anweisung ausgeführt werden, gelten nicht als Teil des Bereichs der PERFORM-Anweisung, wenn:
die EXIT PROGRAM-Anweisung im selben Programm angegeben ist, in dem auch die PERFORM-Anweisung steht, und
die EXIT PROGRAM-Anweisung innerhalb des Bereichs der PERFORM-Anweisung steht.
- Steht im Bereich einer PERFORM-Anweisung eine weitere PERFORM-Anweisung, muss der Bereich der eingebetteten PERFORM-Anweisung entweder völlig innerhalb oder völlig außerhalb des Bereichs der ersten PERFORM-Anweisung liegen. Infolgedessen darf eine PERFORM-Anweisung, deren Ausführung im Bereich einer anderen PERFORM-Anweisung beginnt, nicht zum Ausgang der anderen PERFORM-Anweisung führen; außerdem dürfen zwei oder mehr solcher PERFORM-Anweisungen keinen gemeinsamen Ausgang haben.
Die folgenden Beispiele zeigen zugelassene PERFORM-Konstruktionen:
Dieser Punkt enthält Angaben zur Segmentierung (für weitere Angaben siehe unter Kapitel „Segmentierung").
Tritt eine PERFORM-Anweisung in einem Kapitel auf, dessen Segmentnummer kleiner als die Angabe in der SEGMENT-LIMIT-Klausel ist, so darf sie in ihrem Bereich nur folgende Prozeduren enthalten:
entweder Kapitel, die alle eine Segmentnummer kleiner 50 haben,
oder Kapitel, die als Ganzes in einem einzigen Segment enthalten sind, dessen Segmentnummer größer als 49 ist.
Tritt eine PERFORM-Anweisung in einem Kapitel auf, dessen Segmentnummer größer als 49 ist, so darf sie in ihrem Bereich nur folgende Prozeduren enthalten:
entweder Kapitel, die alle die gleiche Segmentnummer haben wie das Kapitel, das die PERFORM-Anweisung enthält,
oder Kapitel, die alle eine Segmentnummer kleiner 50 haben.
Wird ein Prozedurname in einem Segment mit einer Segmentnummer größer 49 durch eine PERFORM-Anweisung angesprochen, die in einem Segment mit einer unterschiedlichen Segmentnummer liegt, so wird das angesprochene Segment in seinem Initialzustand zur Verfügung gestellt (d.h. also, dass alle durch ausgeführte ALTER-Anweisungen veränderten GO TO-Anweisungen in diesem Segment auf ihren Ursprungswert gesetzt werden).
Beispiel 8-59
PERFORM X-PAR. ADD A TO B.
Beispiel 8-60
... PERFORM X1-PAR THRU X3-PAR. ... X-KAP SECTION. X1-PAR. ... X2-PAR. ... X3-PAR. ... Y-KAP SECTION. ...
Die PERFORM-Anweisung bewirkt, dass alle Anweisungen in den Paragrafen X1-PAR, X2-PAR und X3-PAR ausgeführt werden.
Beispiel 8-61
Die gleiche Wirkung wie im vorausgehenden Beispiel würde mit der folgenden Anweisung erzielt:
PERFORM X-KAP.
Format 2
"out-of-line"
PERFORM prozedurname-1 [{THRU | THROUGH} prozedurname-2] {bezeichner-1 | ganzzahl-1} TIMES
"in-line"
PERFORM {bezeichner-1 | ganzzahl-1} TIMES unbedingte-anweisung END-PERFORM
Syntaxregeln
bezeichner-1 bezeichnet ein als ganzzahlig beschriebenes numerisches Datenfeld.
Die Wörter THROUGH und THRU sind gleichbedeutend.
Wenn prozedurname-1 und prozedurname-2 angegeben sind und jeweils Namen einer Prozedur innerhalb von Prozedurvereinbarungsprozeduren sind, so müssen beide Prozedurnamen innerhalb desselben Prozedurvereinbarungskapitels liegen.
Allgemeine Regeln
END-PERFORM beendet den Gültigkeitsbereich der „in-line“-PERFORM-Anweisung.
Eine „in-line“-PERFORM-Anweisung funktioniert in Übereinstimmung mit den folgenden Allgemeinen Regeln genauso wie eine „out-of-line“-PERFORM-Anweisung, mit der Ausnahme, dass die in einem „in-line“-PERFORM enthaltenen Anweisungen an Stelle der im Bereich von prozedurname-1 (bis prozedurname-2, falls angegeben) stehenden Anweisungen ausgeführt werden. Alle Allgemeinen Regeln gelten für „in-line“- und „outof-line“-PERFORM gleichermaßen, außer es wird gesondert auf die beiden PERFORM-Arten eingegangen.
Wenn eine PERFORM-Anweisung ausgeführt wird, so geht die Ablaufsteuerung zu der ersten Anweisung der Prozedur über, die mit prozedurname-1 bezeichnet ist. Der implizite Rücksprung zur nächsten ausführbaren Anweisung nach der PERFORM-Anweisung erfolgt folgendermaßen:
Wenn prozedurname-1 ein Paragrafenname und prozedurname-2 nicht angegeben ist, erfolgt der Rücksprung nach der letzten Anweisung von prozedurname-1.
Wenn prozedurname-1 ein Kapitelname und prozedurname-2 nicht angegeben ist, erfolgt der Rücksprung nach der letzten Anweisung des letzten Paragrafen von prozedurname-1.
Wenn prozedurname-2 angegeben und ein Paragrafenname ist, erfolgt der Rücksprung nach der letzten Anweisung des Paragrafen.
Wenn prozedurname-2 angegeben und ein Kapitelname ist, so erfolgt der Rücksprung nach der letzten Anweisung im letzten Paragrafen des Kapitels.
Wird ein „in-line“-PERFORM verwendet, ist die Ausführung der PERFORM-Anweisung nach der letzten in der PERFORM-Anweisung enthaltenen Anweisung abgeschlossen.
Es gibt keine notwendige Verbindung zwischen prozedurname-1 und prozedurname-2, außer dass eine fortlaufende Reihe von Operationen, beginnend bei prozedurname-1, ausgeführt werden soll, die mit der Ausführung der mit prozedurname-2 bezeichneten Prozedur endet. Sogar GO TO- und PERFORM-Anweisungen können zwischen prozedurname-1 und dem Ende von prozedurname-2 auftreten. Wenn es zwei oder mehr logische Wege zum Rücksprungpunkt gibt, kann prozedurname-2 der Name eines Paragrafen sein, der eine EXIT-Anweisung enthält, auf die alle diese Ablaufwege führen müssen.
Die Anweisungen, die im Bereich der PERFORM-Anweisung liegen, werden so oft ausgeführt, wie durch ganzzahl-1 oder den Wert von bezeichner-1 angegeben ist. Nach der Ausführung der angegebenen Anweisungsfolge geht die Ablaufsteuerung zum Ende der PERFORM-Anweisung über.
Falls der Wert von bezeichner-1 bei Ausführung der PERFORM-Anweisung Null oder negativ ist, geht die Ablaufsteuerung zum Ende der PERFORM-Anweisung über.
Der Bereich einer PERFORM-Anweisung besteht logisch aus all jenen Anweisungen, die infolge der PERFORM-Anweisung ausgeführt werden; dies erfolgt auf Grund des impliziten Übergangs der Ablaufsteuerung zum Ende der PERFORM-Anweisung. Der Bereich schließt alle Anweisungen ein, die als Folge von CALL-, EXIT-, GO TO- und PERFORM-Anweisungen im Bereich einer PERFORM-Anweisung ausgeführt werden; dies gilt ebenso für alle Anweisungen, die im Rahmen von Prozedurvereinbarungen infolge der Ausführung von Anweisungen im Bereich der PERFORM-Anweisung ausgeführt werden. Die Anweisungen im Bereich einer PERFORM-Anweisung müssen nicht aufeinanderfolgend in der Übersetzungseinheit stehen.
Anweisungen, die auf Grund einer EXIT PROGRAM-Anweisung ausgeführt werden, gelten nicht als Teil des Bereichs der PERFORM-Anweisung, wenn:
die EXIT PROGRAM-Anweisung im selben Programm angegeben ist, in dem auch die PERFORM-Anweisung steht, und
die EXIT PROGRAM-Anweisung innerhalb des Bereichs der PERFORM-Anweisung steht.
Steht im Bereich einer PERFORM-Anweisung eine weitere PERFORM-Anweisung, muss der Bereich der eingebetteten PERFORM-Anweisung entweder völlig innerhalb oder völlig außerhalb des Bereichs der ersten PERFORM-Anweisung liegen. Infolgedessen darf eine PERFORM-Anweisung, deren Ausführung im Bereich einer anderen PERFORM-Anweisung beginnt, nicht zum Ausgang der anderen PERFORM-Anweisung führen; außerdem dürfen zwei oder mehr solcher PERFORM-Anweisungen keinen gemeinsamen Ausgang haben.
Die folgenden Beispiele zeigen zugelassene PERFORM-Konstruktionen:
Dieser Punkt enthält Angaben zur Segmentierung (für weitere Angaben siehe unter Kapitel „Segmentierung").
Tritt eine PERFORM-Anweisung in einem Kapitel auf, dessen Segmentnummer kleiner als die Angabe in der SEGMENT-LIMIT-Klausel ist, so darf sie in ihrem Bereich nur folgende Prozeduren enthalten:
entweder Kapitel, die alle eine Segmentnummer kleiner 50 haben,
oder Kapitel, die als Ganzes in einem einzigen Segment enthalten sind, dessen Segmentnummer größer als 49 ist.
Tritt eine PERFORM-Anweisung in einem Kapitel auf, dessen Segmentnummer größer als 49 ist, so darf sie in ihrem Bereich nur folgende Prozeduren enthalten:
entweder Kapitel, die alle die gleiche Segmentnummer haben wie das Kapitel, das die PERFORM-Anweisung enthält,
oder Kapitel, die alle eine Segmentnummer kleiner 50 haben.
Wird ein Prozedurname in einem Segment mit einer Segmentnummer größer 49 durch eine PERFORM-Anweisung angesprochen, die in einem Segment mit einer unterschiedlichen Segmentnummer liegt, so wird das angesprochene Segment in seinem Initialzustand zur Verfügung gestellt (d.h. also, dass alle durch ausgeführte ALTER-Anweisungen veränderten GO TO-Anweisungen in diesem Segment auf
ihren Ursprungswert gesetzt werden).
Beispiel 8-62
PERFORM X-PAR 5 TIMES.
Alle Anweisungen im Paragrafen X-PAR werden fünfmal ausgeführt. Der Ablauf wird dann bei der auf die PERFORM-Anweisung folgenden Anweisung fortgesetzt.
Beispiel 8-63
... 77 A PICTURE 9. ... MOVE 3 TO A. ... PERFORM X-PAR A TIMES. ... X-PAR. ... ADD 1 TO A. Y-PAR. ...
Da der Wert von A zur Ausführungszeit der PERFORM-Anweisung 3 beträgt, wird der Paragraf X-PAR dreimal ausgeführt.
Die Bezugname auf A innerhalb X-PAR hat keine Auswirkung auf die PERFORM-Anweisung.
Format 3
"out-of-line"
PERFORM prozedurname-1 [{THRU | THROUGH} prozedurname-2]
[WITH TEST {BEFORE | AFTER}] UNTIL bedingung-1
"in-line"
PERFORM [WITH TEST {BEFORE | AFTER}] UNTIL bedingung-1
unbedingte-anweisung END-PERFORM
Syntaxregeln
Die Wörter THROUGH und THRU sind gleichbedeutend.
Wenn prozedurname-1 und prozedurname-2 angegeben sind und jeweils Namen einer Prozedur innerhalb von Prozedurvereinbarungsprozeduren sind, so müssen beide Prozedurnamen innerhalb desselben Prozedurvereinbarungskapitels liegen.
Ist weder TEST BEFORE noch TEST AFTER angegeben, wird TEST BEFORE angenommen.
Allgemeine Regeln
END-PERFORM beendet den Gültigkeitsbereich der „in-line“-PERFORM-Anweisung.
Eine „in-line“-PERFORM-Anweisung funktioniert in Übereinstimmung mit den folgenden Allgemeinen Regeln genauso wie eine „out-of-line“-PERFORM-Anweisung, mit der Ausnahme, dass die in einem „in-line“-PERFORM enthaltenen Anweisungen an Stelle der im Bereich von prozedurname-1 (bis prozedurname-2, falls angegeben) stehenden Anweisungen ausgeführt werden. Alle Allgemeinen Regeln gelten für „in-line“- und „out-of-line“-PERFORM gleichermaßen, außer es wird gesondert auf die beiden PERFORM-Arten eingegangen.
Wenn eine PERFORM-Anweisung ausgeführt wird, so geht die Ablaufsteuerung zu der ersten Anweisung der Prozedur über, die mit prozedurname-1 bezeichnet ist. Der implizite Rücksprung zur nächsten ausführbaren Anweisung nach der PERFORM-Anweisung erfolgt folgendermaßen:
- Wenn prozedurname-1 ein Paragrafenname und prozedurname-2 nicht angegeben ist, erfolgt der Rücksprung nach der letzten Anweisung von prozedurname-1.
- Wenn prozedurname-1 ein Kapitelname und prozedurname-2 nicht angegeben ist, erfolgt der Rücksprung nach der letzten Anweisung des letzten Paragrafen von prozedurname-1.
- Wenn prozedurname-2 angegeben und ein Paragrafenname ist, erfolgt der Rücksprung nach der letzten Anweisung des Paragrafen.
- Wenn prozedurname-2 angegeben und ein Kapitelname ist, so erfolgt der Rücksprung nach der letzten Anweisung im letzten Paragrafen des Kapitels.
- Wird ein „in-line“-PERFORM verwendet, ist die Ausführung der PERFORM-Anweisung nach der letzten in der PERFORM-Anweisung enthaltenen Anweisung abgeschlossen.
Es gibt keine notwendige Verbindung zwischen prozedurname-1 und prozedurname-2, außer dass eine fortlaufende Reihe von Operationen, beginnend bei prozedurname-1, ausgeführt werden soll, die mit der Ausführung der mit prozedurname-2 bezeichneten Prozedur endet. Sogar GO TO- und PERFORM-Anweisungen können zwischen prozedurname-1 und dem Ende von prozedurname-2 auftreten. Wenn es zwei oder mehr logische Wege zum Rücksprungpunkt gibt, kann prozedurname-2 der Name eines Paragrafen sein, der eine EXIT-Anweisung enthält, auf die alle diese Ablaufwege führen müssen.
Die Anweisungen innerhalb einer PERFORM-Anweisung werden einmal ausgeführt, und der Ablauf wird bei der Anweisung fortgesetzt, die der PERFORM-Anweisung folgt.
Der Bereich einer PERFORM-Anweisung besteht logisch aus all jenen Anweisungen, die infolge der PERFORM-Anweisung ausgeführt werden; dies erfolgt auf Grund des impliziten Übergangs der Ablaufsteuerung zum Ende der PERFORM-Anweisung. Der Bereich schließt alle Anweisungen ein, die als Folge von CALL-, EXIT-, GO TO- und PERFORM-Anweisungen im Bereich einer PERFORM-Anweisung ausgeführt werden; dies gilt ebenso für alle Anweisungen, die im Rahmen von Prozedurvereinbarungen infolge der Ausführung von Anweisungen im Bereich der PERFORM-Anweisung ausgeführt werden. Die Anweisungen im Bereich einer PERFORM-Anweisung müssen nicht aufeinanderfolgend in der Übersetzungseinheit stehen.
Anweisungen, die auf Grund einer EXIT PROGRAM-Anweisung ausgeführt werden, gelten nicht als Teil des Bereichs der PERFORM-Anweisung, wenn:
die EXIT PROGRAM-Anweisung im selben Programm angegeben ist, in dem auch die PERFORM-Anweisung steht, und
die EXIT PROGRAM-Anweisung innerhalb des Bereichs der PERFORM-Anweisung steht.
Steht im Bereich einer PERFORM-Anweisung eine weitere PERFORM-Anweisung, muss der Bereich der eingebetteten PERFORM-Anweisung entweder völlig innerhalb oder völlig außerhalb des Bereichs der ersten PERFORM-Anweisung liegen. Infolgedessen darf eine PERFORM-Anweisung, deren Ausführung im Bereich einer anderen PERFORM-Anweisung beginnt, nicht zum Ausgang der anderen PERFORM-Anweisung führen; außerdem dürfen zwei oder mehr solcher PERFORM-Anweisungen keinen gemeinsamen Ausgang haben.
Die folgenden Beispiele zeigen zugelassene PERFORM-Konstruktionen:
Die Anweisungen, die im Bereich der PERFORM-Anweisung liegen, werden solange ausgeführt, bis die Bedingung wahr ist. Wenn die Bedingung wahr ist, geht die Ablaufsteuerung zum Ende der PERFORM-Anweisung über. Ist die Bedingung zu Beginn der PERFORM-Anweisung wahr, und ist TEST BEFORE angegeben oder angenommen, findet kein Übergang zu prozedurname-1 statt, und die Ablaufsteuerung geht zum Ende der PERFORM-Anweisung über.
Ist TEST AFTER angegeben, wird die PERFORM-Anweisung durchgeführt wie wenn TEST BEFORE angegeben wäre, außer dass die Bedingung nach Ausführung der angegebenen Anweisungsfolge geprüft wird.
Alle Modifizierungen der in bedingung-1 angegebenen Operanden werden jedesmal ausgewertet, wenn die Bedingung geprüft wird.
Dieser Punkt enthält Angaben zur Segmentierung (für weitere Angaben siehe unter Kapitel „Segmentierung").
Tritt eine PERFORM-Anweisung in einem Kapitel auf, dessen Segmentnummer kleiner als die Angabe in der SEGMENT-LIMIT-Klausel ist, so darf sie in ihrem Bereich nur folgende Prozeduren enthalten:
entweder Kapitel, die alle eine Segmentnummer kleiner 50 haben,
oder Kapitel, die als Ganzes in einem einzigen Segment enthalten sind, dessen Segmentnummer größer als 49 ist.
Tritt eine PERFORM-Anweisung in einem Kapitel auf, dessen Segmentnummer größer als 49 ist, so darf sie in ihrem Bereich nur folgende Prozeduren enthalten:
entweder Kapitel, die alle die gleiche Segmentnummer haben wie das Kapitel, das die PERFORM-Anweisung enthält,
oder Kapitel, die alle eine Segmentnummer kleiner 50 haben.
Wird ein Prozedurname in einem Segment mit einer Segmentnummer größer 49 durch eine PERFORM-Anweisung angesprochen, die in einem Segment mit einer unterschiedlichen Segmentnummer liegt, so wird das angesprochene Segment in seinem Initialzustand zur Verfügung gestellt (d.h. also, dass alle durch ausgeführte ALTER-Anweisungen veränderten GO TO-Anweisungen in diesem Segment auf ihren Ursprungswert gesetzt werden).
Beispiel 8-64
PERFORM X-PAR UNTIL A GREATER THAN 3. ... X-PAR. ... COMPUTE A = A + 1. ... Y-PAR. ...
Es sei angenommen, dass A = 1 ist, wenn die PERFORM-Anweisung angesprochen wird. In diesem Fall werden die Anweisungen im Paragrafen X-PAR dreimal ausgeführt:
Wenn X-PAR das erste Mal ausgeführt wird, wird A auf 2 gesetzt.
Wenn X-PAR das zweite Mal ausgeführt wird, wird A auf 3 gesetzt.
Wenn X-PAR das dritte Mal ausgeführt wird, wird A auf 4 gesetzt.
Da vier größer als drei ist, ist die in der PERFORM-Anweisung angegebene Bedingung erfüllt. Daher wird der Ablauf mit der auf die PERFORM-Anweisung folgenden Anweisung fortgesetzt.
Format 4
"out-of-line"
PERFORM prozedurname-1 [{THRU | THROUGH} prozedurname-2] [WITH TEST {BEFORE | AFTER}]
VARYING {index-1 | bezeichner-2} FROM {index-2 | literal-1 | bezeichner-3} BY {literal-2 | bezeichner-4} UNTIL bedingung-1
[AFTER {index-3 | bezeichner-5} FROM {index-4 | literal-3 | bezeichner-6} BY {literal-4 | bezeichner-7} UNTIL bedingung-2]...
"in-line"
PERFORM [WITH TEST {BEFORE | AFTER}]
VARYING {index-1|
bezeichner
-2} FROM {index-2 | literal-1 | bezeichner
-3} BY {literal-2 | bezeichner
-4} UNTIL bedingung-1
unbedingte-anweisung END-PERFORM
Syntaxregeln
Die Wörter THROUGH und THRU sind gleichbedeutend.
Wenn prozedurname-1 und prozedurname-2 angegeben sind und jeweils Namen einer Prozedur innerhalb von Prozedurvereinbarungsprozeduren sind, so müssen beide Prozedurnamen innerhalb desselben Prozedurvereinbarungskapitels liegen.
Ist weder TEST BEFORE noch TEST AFTER angegeben, wird TEST BEFORE angenommen.
Jeder Bezeichner stellt ein numerisches, ganzzahlig beschriebenes Datenfeld dar. Der Compiler lässt jedoch zu, dass alle Bezeichner als nicht ganzzahlige numerische Datenfelder beschrieben werden.
Jedes Literal muss numerisch sein.
Das Literal in der BY-Angabe muss eine Ganzzahl ungleich Null sein.
Ist in der VARYING- oder AFTER-Angabe index angegeben, gilt:
Der Bezeichner in der zugehörigen FROM- und BY-Angabe muss ganzzahlig sein.
Das Literal in der zugehörigen FROM-Angabe muss eine positive Ganzzahl sein.
Das Literal in der zugehörigen BY-Angabe muss eine Ganzzahl ungleich Null sein.
Ist in der FROM-Angabe index angegeben, gilt:
Der Bezeichner in der zugehörigen VARYING- oder AFTER-Angabe muss ganzzahlig sein.
Der Bezeichner in der zugehörigen BY-Angabe muss ganzzahlig sein.
Das Literal in der BY-Angabe muss eine Ganzzahl sein.
bedingung-1, bedingung-2 kann jede Art von Bedingungsausdruck sein.
Für die „out-of-line“-PERFORM-Anweisung sind maximal 6 AFTER-Angaben zugelassen.
Allgemeine Regeln
bezeichner-4 und bezeichner-7 dürfen nicht den Wert Null haben.
Ist in der VARYING- oder AFTER-Angabe ein Index und in der zugehörigen FROM-Angabe ein Bezeichner angegeben, muss der Bezeichner einen positiven Wert haben.
Format 4 der PERFORM-Anweisung wird benutzt, um während der Ausführung einer PERFORM-Anweisung den Wert von einem oder mehreren Bezeichnern in bestimmter Weise zu erhöhen oder zu vermindern. Die Ausführung hängt ab von der Anzahl von Bezeichnern oder Indexnamen, die variiert werden. Die folgenden Regeln beschreiben, was geschieht, wenn ein, zwei und drei Bezeichner oder Indexnamen variiert werden.
END-PERFORM beendet den Gültigkeitsbereich der „in-line“-PERFORM-Anweisung.
Eine „in-line“-PERFORM-Anweisung funktioniert in Übereinstimmung mit den folgenden Allgemeinen Regeln genauso wie eine „out-of-line“-PERFORM-Anweisung, mit der Ausnahme, dass die in einem „in-line“-PERFORM enthaltenen Anweisungen an Stelle der im Bereich von prozedurname-1 (bis prozedurname-2, falls angegeben) stehenden Anweisungen ausgeführt werden. Alle Allgemeinen Regeln gelten für „in-line“- und „out-of-line“-PERFORM gleichermaßen, außer es wird gesondert auf die beiden PERFORM-Arten eingegangen.
Wenn eine PERFORM-Anweisung ausgeführt wird, so geht die Ablaufsteuerung zu der ersten Anweisung der Prozedur über, die mit prozedurname-1 bezeichnet ist. Der implizite Rücksprung zur nächsten ausführbaren Anweisung läuft folgendermaßen ab:
Wenn prozedurname-1 ein Paragrafenname und prozedurname-2 nicht angegeben ist, erfolgt der Rücksprung nach der letzten Anweisung von prozedurname-1.
Wenn prozedurname-1 ein Kapitelname und prozedurname-2 nicht angegeben ist, erfolgt der Rücksprung nach der letzten Anweisung des letzten Paragrafen von prozedurname-1.
Wenn prozedurname-2 angegeben und ein Paragrafenname ist, erfolgt der Rücksprung nach der letzten Anweisung des Paragrafen.
Wenn prozedurname-2 angegeben und ein Kapitelname ist, so erfolgt der Rücksprung nach der letzten Anweisung im letzten Paragrafen des Kapitels.
Wird ein „in-line“-PERFORM verwendet, ist die Ausführung der PERFORM-Anweisung nach der letzten in der PERFORM-Anweisung enthaltenen Anweisung abgeschlossen.
Es gibt keine notwendige Verbindung zwischen prozedurname-1 und prozedurname-2, außer dass eine fortlaufende Reihe von Operationen, beginnend bei prozedurname-1, ausgeführt werden soll, die mit der Ausführung der mit prozedurname-2 bezeichneten Prozedur endet. Sogar GO TO- und PERFORM-Anweisungen können zwischen prozedurname-1 und dem Ende von prozedurname-2 auftreten. Wenn es zwei oder mehr logische Wege zum Rücksprungpunkt gibt, kann prozedurname-2 der Name eines Paragrafen sein, der eine EXIT-Anweisung enthält, auf die alle diese Ablaufwege führen müssen.
Alle nachfolgend beschriebenen Bezüge auf einen Bezeichner als Objekt der VARYING-, AFTER- und FROM-(aktueller Wert) Angaben gelten auch für Indizes.
Ist index-1 oder index-3 angegeben, muss der Wert des zugehörigen Index zu Beginn der PERFORM-Anweisung auf eine vorkommende Zahl eines Tabellenelements gesetzt werden.
Ist index-2 oder index-4 angegeben, muss der Wert des durch bezeichner-2 oder bezeichner-5 dargestellten Datenfeldes zu Beginn der PERFORM-Anweisung gleich sein dem einer mit index-2 oder index-4 verbundenen Tabellenelementnummer.
Die nachfolgende In- oder Dekrementierung von index-1 oder index-3 darf nicht enden bei einem Indexwert, der außerhalb des durch index-1 oder index-3 festgelegten Tabellenbereichs gesetzt ist; ausgenommen davon ist, dass bei Beendigung der PERFORM-Anweisung index-1 einen um einen Schritt vergrößerten oder verminderten Wert außerhalb des Tabellenbereichs enthalten darf.
Ist bezeichner-2 oder bezeichner-5 subskribiert, werden die Subskripte jedesmal ausgewertet, wenn der Inhalt des jeweiligen Bezeichners gesetzt oder erhöht (vermindert) wird.
Ist bezeichner-3, bezeichner-4, bezeichner-6 oder bezeichner-7 subskribiert, werden die Subskripte jedesmal ausgewertet, wenn der Inhalt des jeweiligen Bezeichners gesetzt oder erhöht (vermindert) wird.
Anweisungen, die auf Grund einer EXIT PROGRAM-Anweisung ausgeführt werden, gelten nicht als Teil des Bereichs der PERFORM-Anweisung, wenn:
die EXIT PROGRAM-Anweisung im selben Programm angegeben ist, in dem auch die PERFORM-Anweisung steht, und
die EXIT PROGRAM-Anweisung innerhalb des Bereichs der PERFORM-Anweisungsteht.
Steht im Bereich einer PERFORM-Anweisung eine weitere PERFORM-Anweisung, muss der Bereich der eingebetteten PERFORM-Anweisung entweder völlig innerhalb oder völlig außerhalb des Bereichs der ersten PERFORM-Anweisung liegen. Infolgedessen darf eine PERFORM-Anweisung, deren Ausführung im Bereich einer anderen PERFORM-Anweisung beginnt, nicht zum Ausgang der anderen PERFORM-Anweisung führen; außerdem dürfen zwei oder mehr solcher PERFORM-Anweisungen keinen gemeinsamen Ausgang haben.
Die folgenden Beispiele zeigen zugelassene PERFORM-Konstruktionen:
Ist TEST BEFORE angegeben oder angenommen, laufen folgende Vorgänge ab:
Veränderung eines Bezeichners:
Zu Beginn der Ausführung der PERFORM-Anweisung wird der Inhalt von bezeichner-2 auf literal-1 oder auf den laufenden Wert von bezeichner-3 gesetzt.
Danach wird, wenn die Bedingung der UNTIL-Angabe falsch ist, die angegebene Anweisungsfolge einmal ausgeführt.
Der Wert von bezeichner-2 wird um den angegebenen Wert (Wert von literal-2 oder von bezeichner-4) vergrößert oder vermindert und bedingung-1 wird erneut geprüft.
Dieser Zyklus wird fortgesetzt, bis die Bedingung wahr ist; nun geht die Ablaufsteuerung zum Ende der PERFORM-Anweisung über.
Ist bedingung-1 zu Beginn der Ausführung der PERFORM-Anweisung wahr, geht die Ablaufsteuerung zum Ende der PERFORM-Anweisung über.
Veränderung von zwei Bezeichnern:
Zu Beginn der Ausführung der PERFORM-Anweisung wird der Inhalt von bezeichner-2 auf literal-1 oder auf den laufenden Wert von bezeichner-3 gesetzt.
Danach wird der Inhalt von bezeichner-5 auf literal-3 oder auf den laufenden Wert von bezeichner-6 gesetzt.
Anschließend wird bedingung-1 geprüft; ist sie wahr, geht die Ablaufsteuerung zum Ende der PERFORM-Anweisung über.
Ist bedingung-1 falsch, wird bedingung-2 geprüft.
Ist bedingung-2 falsch, wird die angegebene Anweisungsfolge einmal ausgeführt.
Hierauf wird der Inhalt von bezeichner-5 um den Wert von literal-4 oder den Inhalt von bezeichner-7 vergrößert (vermindert) und bedingung-2 erneut geprüft.
Dieser Zyklus wird fortgesetzt, bis bedingung-2 wahr ist.
Ist bedingung-2 wahr, wird bezeichner-2 um den Wert von literal-2 oder bezeichner-4 vergrößert (vermindert) und der Inhalt von bezeichner-5 auf literal-3 oder den momentanen Wert von bezeichner-6 gesetzt.
bedingung-1 wird nochmals geprüft.
Die PERFORM-Anweisung ist abgeschlossen, wenn bedingung-1 wahr ist; andernfalls wird der Zyklus solange fortgesetzt, bis bedingung-1 wahr ist.
Bei Beendigung der PERFORM-Anweisung enthält bezeichner-5 den Wert von literal-3 oder den momentanen Wert von bezeichner-6.
bezeichner-2 enthält einen Wert, der den letzten Inkrement- oder Dekrementschritt um 1 übersteigt, es sei denn, bedingung-1 war zu Beginn der PERFORM-Anweisung wahr. In diesem Fall enthält bezeichner-2 den Wert von literal-1 oder den momentanen Wert von bezeichner-3.Ist TEST AFTER angegeben, laufen folgende Vorgänge ab:
Veränderung eines Bezeichners:
Zu Beginn der Ausführung der PERFORM-Anweisung wird der Inhalt von bezeichner-2 auf literal-1 oder auf den laufenden Wert von bezeichner-3 gesetzt.
Danach wird die angegebene Anweisungsfolge einmal ausgeführt und bedingung-1 der UNTIL-Angabe geprüft.
Ist die Bedingung falsch, wird der Wert von bezeichner-2 um den angegebenen Wert (Wert von literal-2 oder von bezeichner-4) vergrößert oder vermindert und die angegebene Anweisungsfolge erneut ausgeführt.
Dieser Zyklus wird fortgesetzt, bis bedingung-1 geprüft und für wahr befunden wird; zu diesem Zeitpunkt geht die Ablaufsteuerung zum Ende der PERFORM-Anweisung über.
Veränderung von zwei Bezeichnern:
Zu Beginn der Ausführung der PERFORM-Anweisung wird der Inhalt von bezeichner-2 auf literal-1 oder auf den laufenden Wert von bezeichner-3 gesetzt.
Danach wird der Inhalt von bezeichner-5 auf literal-3 oder auf den laufenden Wert von bezeichner-6 gesetzt.
Anschließend wird die angegebene Anweisungsfolge ausgeführt.
Hierauf wird bedingung-2 ausgewertet.
Ist bedingung-2 falsch, wird der Inhalt von bezeichner-5 um den Wert von literal-4 oder den Inhalt von bezeichner-7 vergrößert (vermindert) und die angegebene Anweisungsfolge erneut ausgeführt.
Dieser Zyklus wird fortgesetzt, bis bedingung-2 wiederum geprüft und für wahr befunden wird.
Hierauf wird bedingung-1 geprüft.
Ist bedingung-1 falsch, wird bezeichner-2 um den Wert von literal-2 oder bezeichner-4 vergrößert (vermindert) und der Inhalt von bezeichner-5 auf literal-3 oder den momentanen Wert von bezeichner-6 gesetzt.
Anschließend wird die angegebene Anweisungsfolge erneut ausgeführt.
Dieser Zyklus wird fortgesetzt, bis bedingung-1 geprüft und für wahr befunden wird; dann geht die Ablaufsteuerung zum Ende der PERFORM-Anweisung über.
Nach Beendigung der PERFORM-Anweisung enthält jedes durch die AFTER- oder VARYING-Angabe veränderte Datenfeld den Wert, den es nach dem Ende der letzten Ausführung der angegebenen Anweisungsfolge hatte.
Während der Ausführung der innerhalb der PERFORM-Anweisung angegebenen Anweisungsfolge wird jede Veränderung der VARYING-Variablen (bezeichner-2, index-1), BY-Variable (bezeichner-4), AFTER-Variablen (bezeichner-5, index-3) oder FROM-Variablen (bezeichner-3, index-2) berücksichtigt und beeinflusst die Ausführung der PERFORM-Anweisung.
Wird der Inhalt von zwei Bezeichnern verändert, durchläuft bezeichner-5 einen vollständigen Zyklus (FROM, BY, UNTIL), jedesmal wenn der Inhalt von bezeichner-2 verändert wird.
Wird der Inhalt von drei oder mehr Bezeichnern verändert, ist der Ablauf der gleiche wie bei zwei Bezeichnern, außer dass das durch jede AFTER-Angabe veränderte Datenfeld einen vollständigen Zyklus durchläuft, jedesmal wenn das durch die vorhergehende AFTER-Angabe veränderte Datenfeld in- oder dekrementiert wird.
Dieser Punkt enthält Angaben zur Segmentierung (für weitere Angaben siehe unter Kapitel „Segmentierung").
Tritt eine PERFORM-Anweisung in einem Kapitel auf, dessen Segmentnummer kleiner als die Angabe in der SEGMENT-LIMIT-Klausel ist, so darf sie in ihrem Bereich nur folgende Prozeduren enthalten:
entweder Kapitel, die alle eine Segmentnummer kleiner 50 haben,
oder Kapitel, die als Ganzes in einem einzigen Segment enthalten sind, dessen Segmentnummer größer als 49 ist.
Tritt eine PERFORM-Anweisung in einem Kapitel auf, dessen Segmentnummer größer als 49 ist, so darf sie in ihrem Bereich nur folgende Prozeduren enthalten:
entweder Kapitel, die alle die gleiche Segmentnummer haben wie das Kapitel, das die PERFORM-Anweisung enthält
oder Kapitel, die alle eine Segmentnummer kleiner 50 haben.
Wird ein Prozedurname in einem Segment mit einer Segmentnummer größer 49 durch eine PERFORM-Anweisung angesprochen, die in einem Segment mit einer unterschiedlichen Segmentnummer liegt, so wird das angesprochene Segment in seinem Initialzustand zur Verfügung gestellt (d.h. also, dass alle durch ausgeführte ALTER-Anweisungen veränderte GO TO-Anweisungen in diesem Segment auf ihren Ursprungswert gesetzt werden).
Beispiel 8-65
... 01 STAATEN. 02 BEZIRKE OCCURS 51 INDEXED STAAT. 03 ERSTER-BEZIRK PIC 9(3). 03 LETZTER-BEZIRK PIC 9(3). 03 STAEDTE OCCURS 100 INDEXED BEZIRK. 04 ERSTE-STADT PIC 9(3). 04 LETZTE-STADT PIC 9(3). 01 STADT PIC 9(3). ... PROCEDURE DIVISION. K1. PERFORM X-PAR THRU Y-PAR VARYING STAAT FROM 1 BY 1 UNTIL STAAT IS GREATER THAN 50; AFTER BEZIRK FROM ERSTER-BEZIRK (STAAT) BY 1 UNTIL BEZIRK IS EQUAL TO LETZTER-BEZIRK (STAAT) AFTER STADT FROM ERSTE-STADT (STAAT BEZIRK) UNTIL STADT IS EQUAL TO LETZTE-STADT (STAAT BEZIRK) . . .
Ablaufplan:
Beispiel 8-66
für Format 3 und 4, WITH TEST AFTER/BEFORE
IDENTIFICATION DIVISION. PROGRAM-ID. PWTA. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. TERMINAL IS T. DATA DIVISION. WORKING-STORAGE SECTION. 77 N PIC 9. 77 K PIC 9(3). 77 Z PIC 9(4). 77 E PIC 9(4). PROCEDURE DIVISION. P1 SECTION. BERECHNUNG. MOVE 0 TO Z. DISPLAY "Einstellige Zahl als obere Grenze N eingeben" UPON T. ACCEPT N FROM T. PERFORM WITH TEST AFTER VARYING K FROM 1 BY 1 UNTIL K >= N COMPUTE E = K ** 3 ADD E TO Z END-PERFORM DISPLAY "Ergebnis =" Z UPON T. ENDE. STOP RUN.
Das Programm berechnet die n-te Summe der 3.Potenzen einer Ganzzahl K. Zunächst werden die Anweisungen COMPUTE und ADD ausgeführt, dann erst wird geprüft, ob die Abbruchbedingung erfüllt ist.
Bei Angabe von TEST BEFORE wird zuerst die Abbruchbedingung geprüft. Ist K <= N, werden die „in-line“-Anweisungen ausgeführt. Ist K > N, wird die PERFORM-Anweisung mit END-PERFORM beendet.