10.2. Příkaz EXAMINE Formát 1: EXAMINE položka... REPLACING - - | ALL | | LEADING | | ENDING | - - - - | UNTIL FIRST | | 'znak-1' | | 'znak-2' | < AFTER LAST > < fig.konst.-1 > BY < fig.konst.-2 > | UNTIL LAST | | cifra-1 | | cifra-2 | | AFTER FIRST | - - - - | FIRST | | LAST | - - Funkce: Všechny znaky s dále popsanou vlastností se ve všech položkách uvedených za slovem EXAMINE nahradí znakem-2: a) ALL: Všechny znaky-1 v položce se nahradí znakem-2. b) LEADING: Všechny znaky-1 na začátku položky (tj. před prvním znakem zleva různým od znaku-1) se nahradí znakem-2. Jsou-li v položce pouze znaky-1, nahradí se všechny znakem-2. c) ENDING: Všechny znaky-1 na konci položky (tj. za posledním znakem různým od znaku-1) se nahradí znakem-2. Jsou-li v položce pouze znaky-1, nahradí se všechny znakem-2. d) UNTIL FIRST: Všechny znaky různé od znaku-1 na začátku položky (tj. před prvním znakem-1 zleva) se nahradí znakem-2. Není-li v položce žádný znak-1, nahradí se všechny znaky položky znakem-2. e) AFTER LAST: Všechny znaky různé od znaku-1 na konci položky (tj. za posledním znakem-1) se nahradí znakem-2. Není-li v položce žádný znak-1, nahradí se všechny znaky položky znakem-2. f) UNTIL LAST: Všechny znaky od začátku položky až po poslední znak-1 v položce (včetně) se nahradí znakem-2. Není-li v položce žádný znak-1, nenahrazuje se nic. g) AFTER FIRST: Všechny znaky počínaje prvním znakem-1 v položce (včetně) až do konce položky se nahradí znakem-2. Není-li v položce žádný znak-1, nenahrazuje se nic. h) FIRST: První znak-1 v položce se nahradí znakem-2. Není-li v položce žádný znak-1, nenahrazuje se nic. i) LAST: Poslední znak-1 v položce se nahradí znakem-2. Není-li v položce žádný znak-1, nenahrazuje se nic. Formát 2: - - | ALL | | LEADING | | ENDING | - - | UNTIL FIRST | | 'znak-1' | EXAMINE položka TALLYING < AFTER LAST > < fig.konstanta-1 > | UNTIL LAST | | cifra-1 | | AFTER FIRST | - - | FIRST | | LAST | - - - - - - | | 'znak-2' | | | REPLACING BY < fig.konstanta-2 > | | | cifra-2 | | - - - - Funkce: Při formátu pouze s klauzulí TALLYING, avšak bez klauzule REPLACING, se zjistí počet těch znaků, které by byly ve formátu 1 nahrazovány. Tento počet se dosadí do položky TALLY definované překladačem (viz 4.11.). Položka TALLY pak může být využita v kterýchkoliv cobolských příkazech. Obsah zkoumané položky uvedené za slovem EXAMINE se nezmění. Výjimku tvoří volby FIRST a LAST (povolené ve formátu 2 jen pro úplnost), při nichž se do položky TALLY dosadí počet znaků následujících za prvním (při FIRST) resp. předcházejících před posledním (při LAST) znakem-1 v položce včetně tohoto znaku-1 samého. Bude tedy v TALLY při FIRST táž hodnota jako při AFTER FIRST a při LAST táž hodnota jako při UNTIL LAST. Při formátu s oběma klauzulemi TALLYING i REPLACING se provádějí současně obě funkce, tedy příslušné znaky se jednak nahrazují znakem-2 jako u formátu 1, a jednak se jejich počet dosazuje do TALLY (opět s touž výjimkou při FIRST a LAST). Pravidla: 1) Ve formátu 1 lze uvést i několik zpracovávaných položek; budou zpracovány postupně nezávisle na sobě. Ve formátu 2 lze uvést pouze jedinou zpracovávanou položku (neboť existuje pouze jedna položka TALLY). Tyto zpracovávané položky mohou být jakéhokoliv typu, zpracovávají se však vždy alfanumericky. Příkaz EXAMINE může být tedy těžko rozumně použit pro položky, které nemají USAGE DISPLAY. 2) 'Znak-1' a 'znak-2' mohou být libovolné jednoznakové alfanumerické literály (neexistují žádná omezení např. vzhledem k typu zpracovávané položky). Figurativní konstanta se zpracovává jako jednoznakový alfanumerický literál. Cifra 0 až 9 se zpracovává, jako kdyby byla zapsána v apostrofech. Příklad: Položka A má PIC X(10) a obsah AABACABCBB. Ukážeme, jak se změní obsah položky A a hodnota položky TALLY po provedení následujících příkazů EXAMINE: a) EXAMINE A REPLACING ALL 'A' BY '8' A = 88B8C8BCBB, TALLY nezměněno. b) EXAMINE A TALLYING ALL 'A' A nezměněno, TALLY = 4. c) EXAMINE A TALLYING ALL 'A' REPLACING BY '8' A = 88B8C8BCBB, TALLY = 4. d) EXAMINE A TALLYING ALL 'D' REPLACING BY '*' A nezměněno, TALLY = 0. e) EXAMINE A REPLACING LEADING 'A' BY ZEROS A = 00BACABCBB, TALLY nezměněno. f) EXAMINE A TALLYING LEADING 'B' REPLACING BY 7 A nezměněno, TALLY = 0. g) EXAMINE A TALLYING ENDING 'B' REPLACING BY '+' A = AABACABC++, TALLY = 2. h) EXAMINE A REPLACING UNTIL FIRST 'C' BY QUOTE A = ''''CABCBB, TALLY nezměněno. i) EXAMINE A REPLACING UNTIL FIRST 'A' BY '5' A nezměněno, TALLY nezměněno. j) EXAMINE A TALLYING UNTIL FIRST 'T' REPLACING BY '?' A = ??????????, TALLY = 10. k) EXAMINE A TALLYING AFTER LAST 'A' REPLACING BY '(' A = AABACA((((, TALLY = 4. l) EXAMINE A TALLYING AFTER LAST 'B' REPLACING BY 9 A nezměněno, TALLY = 0. m) EXAMINE A TALLYING AFTER LAST 'H' REPLACING BY 6 A = 6666666666, TALLY = 10. n) EXAMINE A REPLACING UNTIL LAST 'A' BY 3 A = 333333BCBB, TALLY nezměněno. o) EXAMINE A TALLYING UNTIL LAST 'D' REPLACING BY 3 A nezměněno, TALLY = 0. p) EXAMINE A TALLYING AFTER FIRST 'C' REPLACING BY '/' A = AABA//////, TALLY = 6. q) EXAMINE A TALLYING AFTER FIRST 'A' REPLACING BY 2 A = 2222222222, TALLY = 10. r) EXAMINE A TALLYING AFTER FIRST SPACE REPLACING BY 7 A nezměněno, TALLY = 0. s) EXAMINE A REPLACING FIRST 'B' BY 9 A = AA9ACABCBB, TALLY nezměněno. t) EXAMINE A TALLYING FIRST 'B' REPLACING BY '9' A = AA9ACABCBB, TALLY = 8. u) EXAMINE A TALLYING FIRST '+' REPLACING BY '-' A nezměněno, TALLY = 0. v) EXAMINE A REPLACING LAST 'C' BY ZERO A = AABACAB0BB, TALLY nezměněno w) EXAMINE A TALLYING LAST 'B' REPLACING BY ')' A = AABACABCB), TALLY = 10. x) EXAMINE A TALLYING LAST '5' REPLACING BY SPACE A nezměněno, TALLY = 0. Příklad: Čteme logické věty obsahující (mimo jiné) položky POCET, CENA a VAHA s numerickým obsahem (mohou být popsány jako numerické rozpakované nebo jako alfanumerické). Pokud - jak bývá zvykem - se do položek věty neděrují levostranné bezvýznamné nuly, je nutné nejprve v těchto položkách změnit všechny levostranné mezery na nuly pomocí příkazů EXAMINE POCET REPLACING LEADING SPACE BY ZERO EXAMINE CENA REPLACING LEADING SPACE BY ZERO EXAMINE VAHA REPLACING LEADING SPACE BY ZERO což lze v našem COBOLu provést jediným příkazem EXAMINE POCET CENA VAHA REPLACING LEADING SPACE BY ZERO. Pokud by takovýto příkaz nebyl proveden, obsah položek obsahujících levostranné mezery by i nadále zůstal numericky nepřípustný. Většina výpočtů s nimi by ovšem přesto byla provedena správně, i když existují výjimky, při nichž by došlo k chybě. Závažné však je, že beze změny levostranných mezer na nuly bude nepravdivým test na numeričnost, např. IF POCET NOT NUMERIC OR CENA NOT NUMERIC OR VAHA NOT NUMERIC GO TO VADNY-STITEK. Test na numeričnost by tedy měl být nepostradatelnou součástí každého rutinního zpracování vstupních dat vytvářených člověkem. Z předešlého přitom vyplývá, že pro správné provedení tohoto testu je nutné předem provést výše uvedený příkaz EXAMINE. Současnou změnu levostranných mezer na nuly a test na numeričnost lze v našem COBOLu provést též pomocí příkazu (viz 17.3.) CALL 'ICVERIF' USING POCET CENA VAHA VADNY-STITEK. Pokud by bylo ve výše uvedeném příkazu EXAMINE místo slova LEADING uvedeno slovo ALL anebo kdyby byl místo příkazu EXAMINE použit příkaz TRANSFORM POCET CENA VAHA FROM SPACE TO ZERO byly by měněny na nuly i pravostranné mezery a dále mezery vynechané mezi číslicemi, kteréžto mezery vznikají většinou při chybě děrování. Pokud programátor dovolí, aby se při děrování vynechávaly mezery místo všech nul (tedy i místo pravostranných a vnitřních), znemožní tím rozpoznání mnoha chyb při děrování, které by jinak mohly být snadno rozpoznány.