Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

INSPECT-Anweisung

&pagelevel(4)&pagelevel

Funktion

Mit der INSPECT-Anweisung lassen sich einzelne Zeichen oder Zeichengruppen in Datenfeldern zählen, ersetzen oder zählen und ersetzen.

Format 1 (zählen)


INSPECT bezeichner-1 TALLYING

{bezeichner-2 FOR { { {ALLLEADING} {bezeichner-3 | literal-1} | CHARACTERS
  [{BEFORE | AFTER} INITIAL {bezeichner-4 | literal-2}]... }... }...


Format 2 (ersetzen)


INSPECT bezeichner-1 REPLACING

{ CHARACTERS BY {bezeichner-5 | literal-3} [{BEFORE | AFTER} INITIAL {bezeichner-4 | literal-2}]... 

 |{ALLLEADINGFIRST} { {bezeichner-3 | literal-1} BY {bezeichner-5 | literal-3} [{BEFOREAFTER} INITIAL {bezeichner-4 | literal-2} ]... }...
}...


Format 3 (zählen und ersetzen)


INSPECT bezeichner-1 TALLYING

{bezeichner-2 FOR {{ {ALLLEADING} {bezeichner-3 | literal-1} | CHARACTERS} [{BEFOREAFTER} INITIAL {bezeichner-4 | literal-2}]... }... }...

REPLACING

{ CHARACTERS BY {bezeichner-5 | literal-3} [{BEFOREAFTER} INITIAL {bezeichner-4 | literal-2 }]... 

 |{ALLLEADINGFIRST} { {bezeichner-3 | literal-1} BY {identifier-5 | literal-3} [{BEFOREAFTER} INITIAL {bezeichner-4 | literal-2}]... }... }...


Format 4 (umwandeln)


INSPECT bezeichner-1 CONVERTING {bezeichner-6 | literal-4} TO {bezeichner-7 | literal-5} [{BEFOREAFTER} INITIAL {bezeichner-4 | literal-2}]...


Syntaxregeln für alle Formate

  1. bezeichner-1 kann sowohl eine alphanumerische oder nationale Datengruppe als auch ein Datenelement bezeichnen, dass implizit oder explizit mit USAGE DISPLAY oder USAGE NATIONAL beschrieben ist.

  2. bezeichner-3, ..., bezeichner-n können sowohl eine alphanumerische oder nationale Datengruppe als auch ein Datenelement bezeichnen, dass implizit oder explizit mit USAGE DISPLAY oder USAGE NATIONAL beschrieben ist.

  3. literal-1, ..., literal-5 müssen nichtnumerische Literale sein. Sie dürfen keine figurativen Konstanten sein, die mit ALL beginnen.

    Sind literal-1, literal-2 oder literal-4 figurative Konstanten, dann stehen sie für ein implizites 1 Zeichen langes Datenfeld. Ist bezeichner-1 von der Klasse national, dann ist auch die Klasse der figurativen Konstanten national. Andernfalls ist die Klasse der figurativen Konstanten alphanumerisch.
  4. Ist irgendein literal-1, ..., literal-5, bezeichner-1, ..., bezeichner-7 von der Klasse national, dann müssen alle von der Klasse national sein.

  5. Jeder einzelnen ALL-, LEADING-, CHARACTERS-, FIRST- oder CONVERTING-Angabe darf nur eine BEFORE- und/oder AFTER-Angabe zugeordnet werden.

    Syntaxregel für Format 1 und 3

  6. bezeichner-2 muss ein numerisches Datenelement sein.

    Syntaxregeln für Format 2 und 3

  7. literal-3 bzw. bezeichner-5 müssen die gleiche Größe haben wie literal-1 bzw. bezeichner-3. Ist literal-3 eine figurative Konstante, hat es implizit die gleiche Größe wie literal-1 bzw. bezeichner-3.

  8. Ist CHARACTERS angegeben, dürfen literal-3 und bezeichner-5 nur 1 Zeichen lang sein.

    Syntaxregeln für Format 4

  9. literal-5 bzw. bezeichner-7 müssen die gleiche Größe haben wie literal-4 bzw. bezeichner-6. Ist literal-5 eine figurative Konstante, hat es implizit die gleiche Größe wie literal-4 bzw. bezeichner-6.

  10. Dasselbe Zeichen darf nur einmal in literal-4 bzw. bezeichner-6 vorkommen.

Allgemeine Regeln für alle Formate

  1. Die Länge von bezeichner-1 wird wie für Sendefelder berechnet (siehe Abschnitt „OCCURS-Klausel").
    Ist bezeichner-1 ein null-längiges Datenfeld:

    1. bezeichner-1 und bezeichner-2 bleiben unverändert.

    2. Die Ablaufsteuerung geht zum Ende der INSPECT-Anweisung über.

  2. bezeichner-1 wird - ohne Rücksicht auf seine Datenklasse - von links nach rechts abgearbeitet.

  3. Der Inhalt der Datenfelder von bezeichner-1, bezeichner-3, bezeichner-4, bezeichner-5, bezeichner-6, bezeichner-7 wird wie folgt behandelt:

    1. Ist einer dieser Bezeichner alphabetisch, alphanumerisch oder national definiert, wird sein Inhalt wie eine Zeichenkette der entsprechenden Kategorie behandelt.

    2. Ist einer dieser Bezeichner alphanumerisch druckaufbereitet, numerisch druckaufbereitet oder numerisch ohne Vorzeichen definiert, wird er so behandelt, als wäre er alphanumerisch redefiniert.

      Ist einer dieser Bezeichner numerisch mit Vorzeichen definiert, wird er so behandelt, als ob er in ein numerisches Datenfeld ohne Vorzeichen, das die gleiche Größe hat (die Vorzeichenposition nicht mitgezählt), übertragen worden wäre und dieses Feld alphanumerisch redefiniert worden wäre (siehe „MOVE-Anweisung").

      Ist bezeichner-1 ein numerisch definiertes Datenfeld mit Vorzeichen, bleibt der ursprüngliche Wert dieses Vorzeichens bis nach der Ausführung der INSPECT-Anweisung erhalten.

  4. Ist einer dieser Bezeichner indiziert, wird der Indexwert für diese Felder nur einmal berechnet, und zwar unmittelbar vor der Ausführung der INSPECT-Anweisung.

  5. In den Allgemeinen Regeln 5. bis 15. gilt alles, was für literal-1, literal-2, literal-3,literal-4 oder literal-5 gesagt wird, entsprechend für bezeichner-3, bezeichner-4, bezeichner-5, bezeichner-6 oder bezeichner-7.

    Allgemeine Regeln für Format 1, 2 und 3

  6. Während der Prüfung des Inhalts von bezeichner-1 wird jedes Vorkommen von literal-1 gezählt (Format 1) bzw. werden alle mit literal-1 übereinstimmenden Zeichen durch literal-3 ersetzt (Format 2). Ist CHARACTERS angegeben, wird das Zeichen in bezeichner-1, auf das beim jeweils aktuellen Vergleich positioniert ist, gezählt bzw. durch literal-3 ersetzt.

  7. Die Operanden von TALLYING bzw. REPLACING werden von links nach rechts in der Reihenfolge abgearbeitet, in der sie in der INSPECT-Anweisung angegeben sind (Vergleichszyklus). Positioniert wird am Anfang des ersten Vergleichszyklus auf das am weitesten links stehende Zeichen von bezeichner-1.

  8. Ist BEFORE bzw. AFTER nicht angegeben, läuft der Vergleich zur Ermittlung des Vorkommens von literal-1 in bezeichner-1 wie folgt ab:

    1. Das erste literal-1 wird mit einer seiner Größe entsprechenden Anzahl von aufeinanderfolgenden Zeichen von bezeichner-1 verglichen, beginnend mit dem am weitesten links stehenden Zeichen. Übereinstimmung besteht nur dann, wenn literal-1 und der entsprechende Teil von bezeichner-1 Zeichen für Zeichen übereinstimmen.

    2. Liegt keine Übereinstimmung von literal-1 mit bezeichner-1 vor, wird der Vergleich mit jedem folgenden literal-1 fortgesetzt, bis entweder Übereinstimmung festgestellt wird oder kein nächstes literal-1 mehr folgt.

    3. Wird in keinem Fall Übereinstimmung von literal-1 mit bezeichner-1 festgestellt, wird die Positionierung in bezeichner-1 um 1 Zeichen nach rechts verschoben und anschließend der Vergleichszyklus von neuem mit dem ersten literal-1 begonnen.

    4. Liegt Übereinstimmung vor, wird der Vergleichszyklus abgebrochen, bezeichner-2 wird um 1 erhöht und/oder die mit literal-1 übereinstimmenden Zeichen in bezeichner-1 werden durch literal-3 ersetzt. Anschließend wird die Positionierung in bezeichner-1 um die Anzahl der Zeichen von literal-1 nach rechts verschoben und der Vergleichszyklus von neuem mit dem ersten literal-1 begonnen.

    5. Der Vergleich wird so lange fortgesetzt, bis das am weitesten rechts stehende Zeichen von bezeichner-1 entweder das Zeichen ist, bei dem ein Vergleichszyklus anfängt, oder erfolgreich an einem Vergleich mit literal-1 teilgenommen hat.

    6. Ist ALL angegeben, gelten a) bis e) uneingeschränkt. Ist LEADING angegeben, wird das korrespondierende literal-1 auf jeden Fall in das erste Durchlaufen des Vergleichszyklus einbezogen. An den folgenden Vergleichszyklen nimmt es nur dann teil, wenn beim jeweils vorhergehenden Vergleich mit diesem literal-1 Übereinstimmung festgestellt wurde.

      Ist CHARACTERS angegeben, nimmt implizit ein 1 Zeichen langer Operand am Vergleichszyklus teil, so, als ob er als literal-1 angegeben wäre; nur findet kein Vergleich mit dem Inhalt von bezeichner-1 statt, sondern dieser Operand wird immer als übereinstimmend mit dem Zeichen von bezeichner-1 betrachtet, auf das während eines laufenden Vergleichszyklus positioniert ist.
  9. Ist die BEFORE- bzw. AFTER-Angabe gemacht, wird das unter 7. Gesagte wie folgt eingeschränkt:

    1. Ist BEFORE angegeben, wird wie folgt verfahren: literal-1 bzw. (falls CHARACTERS angegeben ist) der implizite Operand nimmt nur an den Vergleichszyklen teil, die auch durchlaufen worden wären, wenn bezeichner-1 mit dem Zeichen geendet hätte, das unmittelbar vor dem ersten Vorkommen von literal-2 in bezeichner-1 steht.

      Kommt literal-2 in bezeichner-1 überhaupt nicht vor oder ist bezeichner-4 ein nulllängiges Datenfeld, läuft der Vergleich so ab, als ob BEFORE nicht angegeben worden wäre.

    2. Ist AFTER angegeben, gilt alles unter a) Gesagte sinngemäß, d.h. es wird nach literal-2 in bezeichner-1 gesucht. Ist es gefunden, wird auf das unmittelbar rechts daneben stehende Zeichen in bezeichner-1 positioniert. Von hier an nimmt literal-1 bzw. (falls CHARACTERS angegeben ist) der implizite Operand an den folgenden Vergleichzyklen teil.

      Kommt literal-2 in bezeichner-1 überhaupt nicht vor oder ist bezeichner-4 ein nulllängiges Datenfeld, nimmt literal-1 bzw. (falls CHARACTERS angegeben ist) der implizite Operand an keinem Vergleichszyklus teil.

    Allgemeine Regeln für Format 1 und 3

  10. Der Inhalt von bezeichner-2 wird bei der Ausführung der INSPECT-Anweisung nicht initialisiert.

  11. Belegen bezeichner-1, bezeichner-3 oder bezeichner-4 denselben Speicherplatz wie bezeichner-2, dann ist das Ergebnis der Ausführung der INSPECT-Anweisung undefiniert, auch dann, wenn die betreffenden Bezeichner in derselben Datenerklärung definiert sind (siehe „Überlappende Operanden").

    Allgemeine Regeln für Format 2 und 3

  12. Die Wörter ALL, LEADING und FIRST, die geschrieben werden müssen, sind Adjektive, die für jede folgende BY-Angabe so lange gelten, bis das nächste Adjektiv angegeben wird.

  13. Ist FIRST angegeben, wird literal-1 in bezeichner-1 nur an der Stelle durch literal-3 ersetzt, an der es zum erstenmal vorkommt. Diese Regel gilt für alle aufeinanderfolgenden FIRST-Angaben, unabhängig vom Wert von literal-1.

  14. Belegen bezeichner-3, bezeichner-4 oder bezeichner-5 denselben Speicherplatz wie bezeichner-1, so ist das Resultat der Ausführung der INSPECT-Anweisung undefiniert, auch dann, wenn die betreffenden Bezeichner in derselben Datenerklärung definiert sind (siehe „Überlappende Operanden").

    Allgemeine Regel für Format 3

  15. Eine INSPECT-Anweisung des Formats 3 wird so ausgeführt, als handele es sich um 2 aufeinanderfolgende INSPECT-Anweisungen, die sich auf denselben bezeichner-1 beziehen, und zwar um eine Anweisung des Formats 1 (mit der TALLYING-Angabe) und eine Anweisung des Formats 2 (mit der REPLACING-Angabe).
    Entsprechend gelten die für Format 1 und 2 angegebenen Regeln. Die Subskripte eines Bezeichners in der Anweisung vom Format 2 werden nur einmal ausgewertet, bevor die Anweisung vom Format 1 ausgeführt wird.

    Allgemeine Regeln für Format 4

  16. Eine INSPECT-Anweisung des Formats 4 wird so interpretiert und ausgeführt, als han-dele es sich um eine INSPECT-Anweisung des Formats 2, in der eine Reihe von ALL-Angaben (für jedes einzelne Zeichen von literal-4 bzw. bezeichner-6 eine ALL-Angabe) gemacht sind, die sich auf denselben bezeichner-1 beziehen.

    Jedes Zeichen von literal-4 bzw. bezeichner-6 und das jeweils zugehörige Zeichen von literal-5 bzw. bezeichner-7 wird also so interpretiert, als wäre es ein eigenes literal-1 (ein eigener bezeichner-3) bzw. literal-3 (bezeichner-5) in Format 2.

    Die eindeutige Zuordnung der Zeichen von literal-4 (bezeichner-6) und literal-5 (bezeichner-7) ergibt sich aus ihrer jeweiligen Position innerhalb des Datenfeldes.

  17. Belegen bezeichner-4, bezeichner-6 oder bezeichner-7 denselben Speicherplatz wie bezeichner-1, dann ist das Ergebnis der Ausführung der INSPECT-Anweisung undefiniert, auch dann, wenn die betreffenden Bezeichner in derselben Datenerklärung definiert sind (siehe „Überlappende Operanden").

Beispiel 8-52

IDENTIFICATION DIVISION.
PROGRAM-ID.  INSP.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
    TERMINAL IS T.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ZAEHLER1 PIC 99 VALUE ZEROES.
01 ZAEHLER2 PIC 99 VALUE 0.
01 ZAEHLER3 PIC 99 VALUE 0.
01 FELD PIC X(20) VALUE SPACES.
   ...

PROCEDURE DIVISION.
PROC SECTION.
ZAEHLEN.
    MOVE "BBYZYZBBYZAXBXBBX" TO FELD.
    INSPECT FELD TALLYING
       ZAEHLER1 FOR ALL "X" AFTER INITIAL "A"
       ZAEHLER2 FOR LEADING "YZ" AFTER INITIAL "BB"            (1)
       ZAEHLER3 FOR CHARACTERS BEFORE INITIAL "A".
    DISPLAY "Nach INSPECT" UPON T.
    DISPLAY "ZAEHLER1 = *" ZAEHLER1 "*" UPON T.
    DISPLAY "ZAEHLER2 = *" ZAEHLER2 "*" UPON T.
    DISPLAY "ZAEHLER3 = *" ZAEHLER3 "*" UPON T.
ERSETZEN-1.
    MOVE "MR. COBOLUSER" TO FIELD.
    DISPLAY "Vor INSPECT" UPON T
    DISPLAY "FELD = *" FELD "*" UPON T.
    INSPECT FELD REPLACING
       CHARACTERS BY "X" AFTER INITIAL "MR. "
                         BEFORE INITIAL "U".
    DISPLAY "Nach INSPECT" UPON T.
    DISPLAY "FELD = *" FELD "*" UPON T.
ERSETZEN-2.
    MOVE "ALGOL-PROGRAM" TO FIELD.
    DISPLAY "Vor INSPECT" UPON T.
    DISPLAY "FELD = *" FELD "*" UPON T.
    INSPECT FELD REPLACING
       ALL "A" BY "C" BEFORE INITIAL "P"
       ALL "L" BY "O" BEFORE INITIAL "G"
       ALL "G" BY "B" BEFORE INITIAL "P".
    DISPLAY "Nach INSPECT" UPON T.
    DISPLAY "FELD = *" FELD "*" UPON T.
ERSETZEN-3.
    MOVE "XXYZYZXXYZ-XYZXYZ" TO FELD.
    DISPLAY "Vor INSPECT" UPON T.
    DISPLAY "FELD = *" FELD "*".
    INSPECT FELD REPLACING
       LEADING "YZ" BY "AB" BEFORE INITIAL "-"
                            AFTER INITIAL "XX"                 (2)
       FIRST "YZ" BY "CD" AFTER INITIAL "-".
    DISPLAY "Nach INSPECT" UPON T.
    DISPLAY "FELD = *" FELD "*" UPON T.
UMWANDELN.
    MOVE "CE#CGDHDEF-CD#F" TO FELD.
    DISPLAY "Vor INSPECT" UPON T.
    DISPLAY "FELD = *" FELD "*" UPON T.
    INSPECT FELD CONVERTING                                   (3)
       "CDEF" TO "UVWU" AFTER "#"
                        BEFORE "-".
    DISPLAY "Nach INSPECT" UPON T.
    DISPLAY "FELD = *" FELD "*" UPON T.
ENDE.
    STOP RUN.

Ergebnis:

Nach INSPECT     (1)

ZAEHLER1 = *03*
ZAEHLER2 = *02*
ZAEHLER3 = *06*

Vor INSPECT

Nach INSPECT

FELD = *MR. COBOLUSER          *
FELD = *ALGOL-PROGRAM          *
FELD = *XXYZYZXXYZ-XYZXYZ      *

FELD = *MR. XXXXXUSER          *
FELD = *COBOL-PROGRAM          *
FELD = *XXABABXXYZ-XCDXYZ      *

FELD = *CE#CGDHDEF-CD#F        *

FELD = *CE#UGVHVWU-CD#F        *

Erläuterung

(1)

Bei ZAEHLER2 wurden die im Folgenden unterstrichenen „YZ“ von FELD gezählt:

BBYZYZBBYZAXBXBBX

Es lag also bei jedem der unterstrichenen „YZ“ eine Übereinstimmung im Sinne von Allgemeine Regel 7f) vor. Deswegen begann der Vergleichszyklus beide Male wieder mit dem ersten literal-1, d.h. mit ZAEHLER1.

Daraus ergibt sich Folgendes:

ZAEHLER3 wird im Fall der unterstrichenen „YZ“ nicht erhöht. Aus diesem Grund werden nur die folgenden unterstrichenen Zeichen gezählt:

BBYZYZBBYZAXBXBBX

ZAEHLER3 ist also = 6.

(2)

Das Ersetzen von führenden „YZ“ durch „AB“ wird veranlasst durch die Angabe AFTER INITIAL "XX". BEFORE INITIAL "-" hat keine Wirkung, da aufgrund der LEADING-Angabe jede Zeichenfolge ungleich „YZ“ weitere Ersetzungen verhindert.

(3)

Diese INSPECT-Anweisung hat die gleiche Wirkung wie die folgende Anweisung:

INSPECT FELD REPLACING
    ALL "C" BY "U" AFTER "#" BEFORE "-"
    ALL "D" BY "V" AFTER "#" BEFORE "-"
    ALL "E" BY "W" AFTER "#" BEFORE "-"
    ALL "F" BY "U" AFTER "#" BEFORE "-".