Die INSPECT-Anweisung

Dieser Befehl wird verwandt, um innerhalb einer Zeichenkette bestimmte Zeichen zu zählen und/oder zu ersetzen.

TALLYING:
Soll gezählt werden, wie oft ein bestimmtes Zeichen in einer Zeichenkette vorkommt, so wird hierfür die TALLYING-Angabe verwendet.
Nehmen wir an, wir möchten ermitteln, wie oft der Buchstabe "e" in "Worbspulenphasengeneratorenreplikatoren" (ich hab' auch keine Ahnung was das ist - wird erst im 23. Jahrhundert erfunden...) vorkommt, so kann man dies mit Hilfe des folgenden kleinen Algorythmus:

          :
01 Wortfeld PIC X(40).
01 E-Zaehler PIC 99 VALUE ZERO.
          :
   MOVE "Worbspulenphasengeneratorenreplikatoren" TO Wortfeld.

   INSPECT Wortfeld TALLYING E-Zaehler FOR ALL "e".


Nach dieser 'Operation' wird in E-Zaehler der Wert 7 zu finden sein, da wir dem Computer gesagt haben: "Untersuche den Inhalt von 'Wortfeld' und zähle alle gefundenen 'e' in das Feld 'E-Zaehler'." Daß alle 'e' gezählt werden sollen, verdeutlichen wir durch den ALL-Zusatz.
Da zu Beginn der Aktion E-Zaehler auf 0 stand, steht er am Ende folglich auf 7. Wird die Aktion wiederholt, ohne daß E-Zaehler wieder auf 0 gesetzt würde, so wäre das Ergebnis beim nächsten mal 14. Daraus folgt, daß der Zähler vom INSPECT-Befehl nicht automatisch initialisiert wird, sondern der Programmierer hierfür Sorge zu tragen hat.
Natürlich kann man auch nach 'Zeichenketten' in der Zeichenkette suchen. Erweitern wir das Beispiel dahingehend, daß wir nicht wissen wollen wie oft 'e', sondern 'en' in "Worbspulenphasengeneratorenreplikatoren" vorkommt:

          :
01 Wortfeld PIC X(40).
01 EN-Zaehler PIC 99 VALUE ZERO.
          :
   MOVE "Worbspulenphasengeneratorenreplikatoren" TO Wortfeld.

   INSPECT Wortfeld TALLYING EN-Zaehler FOR ALL "en".


Ergebins in EN-Zaehler wäre dementsprechend 5.

LEADING-Zusatz
Man kann auch bestimmen, daß man nur die führenden, am Anfang stehenden Zeichen zählen will. Nehmen wir an, daß es vom Worbspulenphasengeneratorenreplikator vier verschiedene Modelle gibt. Diese Modelle unterscheiden sich in der Modellbezeichnung durch die Anzahl des Buchstabens 'G', der dem Kürzel 'WPGR'. Es gibt also "G-WPGR" bis "GGGG-WPGR". Werden solche Teile geliefert, so werden mit Hilfe der INSPECT-Anweisungen die Modelle wie folgt unterschieden (Modellbezeichnung wird in der Variable 'L-Mod' mitgeliefert):

          :
01 L-Mod PIC X(10).
01 Modellbez PIC X(10).
01 G-Zaehler PIC 9 VALUE ZERO.
          :
   MOVE L-Mod TO Modellbez.

   INSPECT Modellbez TALLYING FOR LEADING "G".


Durch den LEADING-Zusatz werden nur die führenden 'G' gezählt. Das 'G' in 'WPGR' wird nicht berücksichtigt.

AFTER / BEFORE-Zusatz:
Mit Hilfe dieses Zusatzes kann man das Intervall in der zu zählenden Zeichenkette bestimmen. Erweitern wir unser Beispiel so, daß jedes der verschiedenen Modelle des Worbspulenphasengeneratoenreplikators weitere Untermodelle besitzt. Diese unterscheiden sich in ihrer Bezeichnung dahingehend, daß auf die Grundbezeichnung (z.B. GGG-WPGR) ein Punkt folgt, nach dem eine weitere Zeichenkette folgt. Die Länge der Zeichenkette nach dem Punkt bestimmt den genauen Typ. Beispiel: 'GGG-WPGR.RG5DG' oder 'GGG-WPGR.NNS3EAF'. Um den Untertyp zu ermitteln könnte man nun sagen:

          :
01 L-Mod PIC X(20).
01 Modellbez PIC X(20).
01 Z-Zaehler PIC 99 VALUE ZERO.
          :
   MOVE L-Mod TO Modellbez.

   INSPECT Modellbez 
      TALLYING Z-Zaehler
      FOR CHARACTERS AFTER INITIAL ".".

In Z-Zaehler würden also nur die Buchstaben gezählt, die nach dem Punkt auftreten.
Um das Modell komplett zu bestimmen könnte man formulieren:

          :
01 L-Mod PIC X(20).
01 Modellbez PIC X(20).
01 G-Zaehler PIC 99 VALUE ZERO.
01 Z-Zaehler PIC 99 VALUE ZERO.
          :
   MOVE L-Mod TO Modellbez.

   INSPECT Modellbez 
      TALLYING G-Zaehler
               FOR CHARACTERS BEFORE "-"
               Z-Zaehler
               FOR CHARACTERS AFTER ".".


Nach der 'Operation' ist folglich in G-Zaehler die Anzahl der Buchstaben (G) vor dem Bindestrich und in Z-Zaehler die Anzahl der Buchstaben nach dem Punkt (z.B. NNS3EAF) abgelegt, wodurch eine genaue Bestimmung des Modells möglich wird.

REPLACING:
Neben der ganzen Zählerei kann der INSPECT-Befehl auch verwendet werden, um Zeichen oder Zeichenfolgen in einer Zeichenkette zu ersetzen. So kann man beispielsweise Inhalte von Feldern ver- und entschlüsseln:

          :
01 Botschaft PIC X(30).
          :

   MOVE "Dies ist die geheime Botschaft" TO Botschaft.

   INSPECT Botschaft REPLACING ALL
      "A" BY "S"   "B" BY "v"   "C" BY "u"   "D" BY "w"
      "E" BY "R"   "F" BY "H"   "G" BY "U"   "H" BY "N"
      "I" BY "I"   "J" BY "P"   "K" BY "c"   "L" BY "z"
      "M" BY "b"   "N" BY "p"   "O" BY "n"   "P" BY "C"
      "Q" BY "x"   "R" BY "A"   "S" BY "G"   "T" BY "j"
      "U" BY "D"   "V" BY "g"   "W" BY "O"   "X" BY "f"
      "Y" BY "L"   "Z" BY "o"
      "a" BY "J"   "b" BY "s"   "c" BY "K"   "d" BY "r"
      "e" BY "i"   "f" BY "l"   "g" BY "W"   "h" BY "k"
      "i" BY "V"   "j" BY "q"   "k" BY "B"   "l" BY "e"
      "m" BY "F"   "n" BY "a"   "o" BY "T"   "p" BY "t"
      "q" BY "Z"   "r" BY "E"   "s" BY "d"   "t" BY "h"
      "u" BY "M"   "v" BY "m"   "w" BY "y"   "x" BY "Q"
      "y" BY "Y"   "z" BY "X".

Danach würde der Inhalt von 'Botschaft' lauten: "wVid Vdh rVi WikiVFi vThdKkJIh" - ist doch schon ganz schön unleserlich, oder?
Um das ganze dann wieder zu entschlüsseln müßte man formulieren:

          :
01 Botschaft PIC X(30).
          :

   MOVE "wVid Vdh rVi WikiVFi vThdKkJIh" TO Botschaft.
   INSPECT Botschaft REPLACING ALL
      "S" BY "A"   "v" BY "B"   "u" BY "C"   "w" BY "D"
      "R" BY "E"   "H" BY "F"   "U" BY "G"   "N" BY "H"
      "l" BY "I"   "P" BY "J"   "c" BY "K"   "z" BY "L"
      "b" BY "M"   "p" BY "N"   "O" BY "O"   "C" BY "P"
      "x" BY "Q"   "A" BY "R"   "n" BY "S"   "j" BY "T"
      "D" BY "U"   "g" BY "V"   "O" BY "W"   "f" BY "X"
      "L" BY "Y"   "o" BY "Z"
      "J" BY "a"   "s" BY "b"   "K" BY "c"   "r" BY "d"
      "i" BY "e"   "I" BY "f"   "W" BY "g"   "k" BY "h"
      "V" BY "i"   "q" BY "j"   "B" BY "k"   "e" BY "l"
      "F" BY "m"   "a" BY "n"   "T" BY "o"   "t" BY "p"
      "Z" BY "q"   "E" BY "r"   "d" BY "s"   "h" BY "t"
      "M" BY "u"   "m" BY "v"   "y" BY "w"   "Q" BY "x"
      "Y" BY "y"   "X" BY "z".

Und schon steht da wieder "Dies ist die geheime Botschaft".
Natürlich kann man zählen und ersetzen auch gleichzeitig veranstalten. Wenn wir (aus welchen Gründen auch immer) neben der Verschlüsselung der Botschaft auch noch die Anzahl der in ihr enthaltenen Leerstellen ermitteln möchten, so müßten wir schreiben:

          :
01 Leerzaehler PIC 99.

01 Botschaft PIC X(30).
          :

   MOVE "Dies ist die geheime Botschaft" TO Botschaft.

   INSPECT Botschaft 
      TALLYING Leerzaehler FOR ALL SPACES
      REPLACING ALL
         "A" BY "S"   "B" BY "v"   "C" BY "u"   "D" BY "w"
         "E" BY "R"   "F" BY "H"   "G" BY "U"   "H" BY "N"
         "I" BY "I"   "J" BY "P"   "K" BY "c"   "L" BY "z"
         "M" BY "b"   "N" BY "p"   "O" BY "n"   "P" BY "C"
         "Q" BY "x"   "R" BY "A"   "S" BY "G"   "T" BY "j"
         "U" BY "D"   "V" BY "g"   "W" BY "O"   "X" BY "f"
         "Y" BY "L"   "Z" BY "o"
         "a" BY "J"   "b" BY "s"   "c" BY "K"   "d" BY "r"
         "e" BY "i"   "f" BY "l"   "g" BY "W"   "h" BY "k"
         "i" BY "V"   "j" BY "q"   "k" BY "B"   "l" BY "e"
         "m" BY "F"   "n" BY "a"   "o" BY "T"   "p" BY "t"
         "q" BY "Z"   "r" BY "E"   "s" BY "d"   "t" BY "h"
         "u" BY "M"   "v" BY "m"   "w" BY "y"   "x" BY "Q"
         "y" BY "Y"   "z" BY "X".


Siehe auch: Codierbeispiel zur INSPECT-Anweisung

...