10.4. Příkaz INSPECT Příkaz INSPECT je zobecněním příkazu EXAMINE, od něhož se liší bohatšími možnostmi. Formát: Aby bylo možno zapsat formát příkazu INSPECT poněkud přehlednějším způsobem, zavedeme si tyto tři zkratky: čítač = celočíselná-položka arg = { položka | alfanumerický-literál | figur.konstanta } interval = {BEFORE|AFTER} {INITIAL|TERMINAL} arg [INCLUDING] Pak lze formát příkazu INSPECT zapsat takto: INSPECT - - - -- - -- | | |celé-číslo|| |LENGTH celé-číslo|| < položka|WITH POINTER < >| | |>... | | |cel.polož.|| |LENGTH cel.polož.|| - - - -- - -- - - - - - - | | | ALL arg [interval] | | | | TALLYING < čítač {FOR|=} < LEADING arg[interval] >...>...| | | | ENDING arg [interval] | | | | | | CHARACTERS [interval] | | | - - - - - - - - - - | | ALL { arg BY arg [interval] }... | | | | LEADING { arg BY arg [interval] }... | | | REPLACING < ENDING { arg BY arg [interval] }... > ... | | | FIRST { arg BY arg [interval] }... | | | | LAST { arg BY arg [interval] }... | | | | CHARACTERS BY arg [interval] | | - - - - Funkce: Příkaz INSPECT vyhledává v zadané položce (resp. v zadaných položkách) zadané znakové řetězce a počítá jejich výskyty nebo je nahrazuje jinými znakovými řetězci (případně provádí obě tyto funkce současně). Za slovem INSPECT je uvedena jedna položka nebo několik položek (z nichž každá může mít za sebou uvedeny ještě klauzule POINTER a LENGTH), v nichž se mají vyhledávat nebo nahrazovat znakové řetězce. Těmto položkám budeme říkat "hlavní položky". Jednotlivé hlavní položky se zpracovávají jedna po druhé přesně tak, jako kdyby byl pro každou z nich uveden samostatný příkaz INSPECT s pouze touto jedinou hlavní položkou a s přesně touž částí TALLYING/REPLACING. Hlavní položka může mít jakýkoliv typ i délku, zpracovává se však vždy alfanumericky (jako kdyby se jednalo o alfanumerickou položku s touž délkou a s týmž obsahem). Za každou hlavní položkou mohou být uvedeny ještě klauzule POINTER a LENGTH (vztahují se pouze k té jediné hlavní položce, za níž jsou uvedeny), které vymezují v hlavní položce jen její určitou část (nazvěme ji "významný úsek"), která vstupuje do vlastního zpracování. Zbylé části hlavní položky (může to být její začátek nebo její konec anebo obojí současně) do zpracování nevstupují a zůstávají beze změny. Klauzule POINTER určuje, od kterého bytu hlavní položky začíná její významný úsek: a) Není-li u hlavní položky klauzule POINTER vůbec uvedena, začíná významný úsek od prvního bytu hlavní položky (tzn. hlavní položka se zpracovává od svého začátku). b) Je-li u hlavní položky uvedena klauzule POINTER, určuje hodnota argumentu v ní uvedeného (celého čísla resp. celočíselné numerické položky) pořadové číslo toho bytu hlavní položky, od něhož začíná významný úsek (tzn. od něhož počínaje se bude hlavní položka zpracovávat). Není požadováno, aby tato hodnota argumentu byla kladná a nejvýše rovna délce hlavní položky; při překročení těchto hranic se pracuje tak, jako kdyby hlavní položka byla prodloužena na obě strany do nekonečna; uživatel pak ručí sám za případné přemazání předcházejících a následujících úseků paměti. Je tedy ekvivalentní neuvést klauzuli POINTER vůbec a uvést ji ve tvaru "POINTER 1". Klauzule LENGTH určuje délku významného úseku hlavní položky: a) Není-li u hlavní položky uvedena ani klauzule LENGTH ani klauzule POINTER, je významný úsek přesně roven celé hlavní položce. b) Není-li u hlavní položky uvedena klauzule LENGTH, avšak je u ní uvedena klauzule POINTER, sahá významný úsek od bytu určeného klauzulí POINTER až do konce hlavní položky. c) Je-li u hlavní položky uvedena klauzule LENGTH, určuje hodnota argumentu v ní uvedeného (celého čísla resp. celočíselné numerické položky) délku významného úseku (a to nezávisle na tom, začíná-li významný úsek od prvního bytu hlavní položky anebo až od bytu určeného klauzulí POINTER). Jak je vidět z formátu, lze v případě, že si přejeme uvést v klauzuli LENGTH celé číslo, vynechat slovo LENGTH a uvést v příkazu pouze toto celé číslo. Pokud délka významného úseku (ať už je určená kterýmkoliv způsobem) není kladná, příkaz INSPECT neprovede pro tuto hlavní položku žádnou akci, pouze vynuluje ty čítače (viz dále), u nichž je předepsána inicializace (tj. u nichž je "=" a nikoliv "FOR"). Je-li za slovem POINTER nebo LENGTH uvedena položka, použije se pro určení začátku resp. délky významného úseku hodnota této položky platná při začátku zpracovávání příslušné hlavní položky; případné změny hodnoty položky za POINTER/LENGTH během zpracovávání hlavní položky již určení začátku resp. délky významného úseku neovlivní. Zápis "arg" ve formátu určuje ten znakový řetězec, který bude ve významném úseku hlavní položky vyhledáván nebo nahrazován, případně jímž se bude jiný znakový řetězec nahrazovat. Může to být položka libovolného typu (vždy se však zpracovává jako alfanumerická), jejíž délka - ať už pevná nebo proměnná - musí být kladná a nejvýše rovná 32767 bytů. Dále to může být alfanumerický literál nebo figurativní konstanta (která se zpracovává jako jednoznakový alfanumerický literál). Volbu "interval", která je zkrácením zápisu {BEFORE|AFTER} {INITIAL|TERMINAL} arg [INCLUDING] lze zapsat buďto v klauzuli TALLYING za zápisem určujícím, že se má zjistit počet výskytů určitého znakového řetězce, anebo v klauzuli REPLACING za zápisem určujícím, že zadaný znakový řetězec má být nahrazován jiným znakovým řetězcem. Zápis volby "interval" má v obou těchto případech stejný význam: předepsaná akce (počítání nebo nahrazování) se má provádět nikoliv v celém významném úseku hlavní položky (určeném klauzulemi POINTER a LENGTH), nýbrž pouze v jeho části (kterou nazveme "skutečný úsek") definované takto: 1) Prohledáme celý významný úsek a nalezneme v něm první (při uvedení INITIAL nebo při neuvedení ani INITIAL ani TERMINAL) resp. poslední (při uvedení TERMINAL) výskyt znakového řetězce "arg". 2) Při BEFORE sahá skutečný úsek od začátku významného úseku až po tento výskyt "arg". Při AFTER sahá skutečný úsek od tohoto výskytu "arg" až do konce významného úseku. 3) Při uvedení slova INCLUDING se nalezený první resp. poslední výskyt znakového řetězce "arg" ke skutečnému úseku počítá, zatímco při neuvedení slova INCLUDING se k němu nepočítá. 4) Není-li znakový řetězec "arg" ve významném úseku vůbec obsažen, pak při BEFORE INITIAL a při AFTER TERMINAL je skutečný úsek roven celému významnému úseku, zatímco při BEFORE TERMINAL a při AFTER INITIAL má skutečný úsek nulovou délku. Slovo INCLUDING je v tomto případě bezvýznamné. 5) Není-li uvedena volba "interval", bude skutečný úsek přesně shodný s celým významným úsekem. Je přípustné, aby byla délka skutečného úseku nulová. Provádí-li příkaz INSPECT více akcí (počítání nebo nahrazování) současně, může být u kterékoliv z těchto akcí volba "interval" uvedena nebo neuvedena, přičemž může být u každé akce uvedena uvedena v jiném tvaru. Může tedy pro každou akci platit jiný skutečný úsek hlavní položky. Příklad: Předpokládejme, že významný úsek hlavní položky má délku 12 bytů a obsah ABCCCDECCCFG. Následující přehled ukazuje, jak bude vypadat skutečný úsek hlavní položky při různých formátech volby "interval". Upozorňujeme, že slovo INITIAL je nepovinné a může být vynecháno. volba "interval" skutečný úsek --------------------------------------------------------- není uvedena ABCCCDECCCFG BEFORE INITIAL 'C' AB BEFORE INITIAL 'C' INCLUDING ABC BEFORE TERMINAL 'C' ABCCCDECC BEFORE TERMINAL 'C' INCLUDING ABCCCDECCC AFTER INITIAL 'C' CCDECCCFG AFTER INITIAL 'C' INCLUDING CCCDECCCFG AFTER TERMINAL 'C' FG AFTER TERMINAL 'C' INCLUDING CFG BEFORE INITIAL 'A' nulová délka BEFORE INITIAL 'A' INCLUDING A BEFORE INITIAL 'H' [INCLUDING] ABCCCDECCCFG BEFORE TERMINAL 'A' nulová délka BEFORE TERMINAL 'H' [INCLUDING] nulová délka AFTER INITIAL 'G' nulová délka AFTER INITIAL 'H' [INCLUDING] nulová délka AFTER TERMINAL 'G' nulová délka AFTER TERMINAL 'H' [INCLUDING] ABCCCDECCCFG Klauzule TALLYING způsobí, že se ve skutečném úseku hlavní položky bude zjišťovat počet výskytů zadaných znakových řetězců. Formát klauzule TALLYING lze schématicky zapsat takto: TALLYING { čítač { FOR | = } kritérium... } ... Za slovem TALLYING je tedy uveden jeden zápis nebo několik zápisů formátu "celočíselná-položka {FOR|=} kritérium...". (V praxi bude ovšem většinou uveden pouze jediný takový zápis a v něm bude uvedeno pouze jediné "kritérium".) Do uvedené celočíselné položky (které budeme říkat "čítač") příkaz INSPECT uloží počet výskytů zadaných znakových řetězců (následuje-li za ní rovnítko) resp. původní hodnotu uvedené celočíselné položky o tento počet výskytů zvýší (následuje-li za ní slovo FOR). Uvedená celočíselná položka musí mít v PICTURE dostatečný počet znaků 9, aby byla schopna pojmout hodnotu, která bude do ní ukládána. Znakové řetězce, jejichž výskyty se mají počítat, jsou zadány tzv. "kritérii". Pro každou uvedenou celočíselnou položku (čítač) může být uvedeno i několik těchto "kritérií"; příkaz INSPECT pak do ní uloží (při rovnítku) resp. k ní přičte (při FOR) součet všech dílčích počtů pro jednotlivá k ní náležející kritéria. Rozlišujeme čtyři typy kritérií: 1) Při "ALL arg" se zjistí počet všech nepřekrývajících se výskytů znakového řetězce "arg" v celém skutečném úseku. 2) Při "LEADING arg" se zjistí počet všech nepřekrývajících se výskytů znakového řetězce "arg" ležících bez přerušení za sebou na začátku skutečného úseku. 3) Při "ENDING arg" se zjistí počet všech nepřekrývajících se výskytů znakového řetězce "arg" ležících bez přerušení za sebou na konci skutečného úseku. 4) Při CHARACTERS se zjistí počet bytů (délka) skutečného úseku. Klauzule REPLACING způsobí, že se ve skutečném úseku hlavní položky budou zadané znakové řetězce nahrazovat jinými znakovými řetězci. Rozlišujeme šest typů nahrazování: 1) Při "ALL arg1 BY arg2" se prochází skutečný úsek zleva doprava (neobsahuje-li klauzule REPLACING žádnou volbu ENDING nebo LAST) resp. zprava doleva (obsahuje-li klauzule REPLACING alespoň jednu volbu ENDING nebo LAST) a každý exemplář řetězce "arg1" se nahradí řetězcem "arg2". Přitom po každém takovém nahrazení začíná další prohledávání skutečného úseku až na prvním bytu ležícím za (při směru zprava doleva: před) právě nahrazeným řetězcem, takže žádný byte skutečného úseku nemůže být nahrazen vícekrát. 2) Při "LEADING arg1 BY arg2" se každý z nepřekrývajících se exemplářů "arg1" ležících bez přerušení za sebou na začátku skutečného úseku nahradí řetězcem "arg2". 3) Při "ENDING arg1 BY arg2" se každý z nepřekrývajících se exemplářů "arg1" ležících bez přerušení za sebou na konci skutečného úseku nahradí řetězcem "arg2". 4) Při "FIRST arg1 BY arg2" se první exemplář řetězce "arg1" ve skutečném úseku (tzn. první zleva) nahradí řetězcem "arg2". Není-li ve skutečném úseku žádný exemplář "arg1", neprovádí se nic. 5) Při "LAST arg1 BY arg2" se poslední exemplář řetězce "arg1" ve skutečném úseku (tzn. první zprava) nahradí řetězcem "arg2". Není-li ve skutečném úseku žádný exemplář "arg1", neprovádí se nic. 6) Při "CHARACTERS BY arg2" musí mít řetězec "arg2" pevnou délku 1 znak. Tímto znakem se nahradí (tj. vyplní) všechny byty skutečného úseku. Při volbách ALL, LEADING, ENDING, FIRST a LAST musí mít "arg2" stejnou délku jako "arg1". Má-li některý z nich proměnnou délku, měl by shodu délek zabezpečit uživatel; přeložený program v tomto případě shodu délek nekontroluje a provádí hledání i nahrazování v délce "arg1", přičemž z "arg2" využívá právě tolik bytů, kolik činí délka "arg1". Za každým ze slov ALL, LEADING, ENDING, FIRST a LAST smí být uvedeno i několik zápisů "arg1 BY arg2 [interval]" způsobujících nahrazování. Význam je stejný, jako kdyby slovo ALL, LEADING, ENDING, FIRST resp. LAST bylo zopakováno před každým tímto zápisem znovu. Tak např. klauzule REPLACING ALL 'A' BY '1' 'B' BY '2' 'C' BY '3' má přesně stejný význam jako klauzule REPLACING ALL 'A' BY '1' ALL 'B' BY '2' ALL 'C' BY '3'. Pravidla: Činnost příkazu INSPECT lze rozdělit na tyto tři základní úkony: - vyhledávání skutečných úseků (při volbách "interval"), - počítání výskytů znakových řetězců (při TALLYING), - nahrazování znakových řetězců (při REPLACING). Má-li příkaz INSPECT provádět několik těchto úkonů, je pořadí jejich provádění určeno těmito pravidly: 1) Nejprve se určí adresa a délka hlavní položky. Jsou-li uvedeny klauzule POINTER nebo LENGTH, určí se adresa a délka významného úseku hlavní položky. 2) Jsou-li v příkazu INSPECT uvedeny nějaké klauzule "interval", provede se nyní postupně pro všechny tyto klauzule vyhledání odpovídajících skutečných úseků. Jejich počáteční adresy a délky se uschovají pro další využití. Je-li u několika akcí uvedena táž klauzule "interval", bude příslušný skutečný úsek vyhledán pouze jednou a jeho počáteční adresa a délka se využijí pro všechny tyto akce. Poznámka: Adresy a délky všech skutečných úseků jsou tedy určeny dle obsahu hlavní položky na začátku jejího zpracovávání a nemohou již být změněny při žádném nahrazování, způsobeném v této hlavní položce při realizaci klauzule REPLACING. 3) Dále proběhnou všechna počítání zadaná klauzulí TALLYING. Příslušné znakové řetězce se tedy hledají v původním obsahu hlavní položky, neovlivněném doposud žádným nahrazováním způsobeným klauzulí REPLACING. Jednotlivá počítání se provádějí nezávisle na sobě, jako kdyby se pro každé "kritérium" znovu prohledával příslušný skutečný úsek hlavní položky. 4) Dále proběhnou všechna nahrazování způsobená klauzulí REPLACING. Jednotlivá nahrazování se však neprovádějí jedno po druhém nezávisle na sobě, nýbrž společně takto: a) Obsahuje-li klauzule REPLACING pouze volby ALL, LEADING, FIRST a CHARACTERS (a žádné ENDING ani LAST), prohledává se významný úsek hlavní položky zleva doprava od začátku byte po bytu, a na každé bytové pozici se zkoumá, zda na ní nezačíná některý "arg1" z některého nahrazování. Tyto dotazy se provádějí postupně v tom pořadí, v jakém jsou jednotlivá nahrazování uvedena v klauzuli REPLACING. Je-li některý "arg1" nalezen (přitom je-li pro toto nahrazování uvedena volba "interval", přijímá se pouze takový "arg1", který leží celý v příslušném skutečném úseku), je nahrazen jemu odpovídajícím "arg2" a další zkoumání významného úseku začne až na prvním bytu za právě nahrazeným znakovým řetězcem. Pokud na určité bytové pozici významného úseku nezačíná žádný "arg1", přejde se na zkoumání bezprostředně následujícího bytu významného úseku. b) Obsahuje-li klauzule REPLACING alespoň jednu z voleb ENDING nebo LAST a k tomu případně ještě navíc nějaké volby ALL nebo CHARACTERS, provádí se nahrazování stejným způsobem, ale postupuje se přitom zprava doleva od konce významného úseku hlavní položky. c) Je zakázáno, aby klauzule REPLACING obsahovala jak některou z voleb LEADING nebo FIRST a současně i některou z voleb ENDING nebo LAST, neboť by nebylo možno jednoznačně určit směr prohledávání významného úseku. (Volby ALL a CHARACTERS mohou být realizovány při kterémkoliv směru prohledávání, a proto se "přizpůsobí" směru určenému ostatními volbami; při víceznakovém "arg1" může být ovšem účinek nahrazování typu ALL závislý na směru prohledávání. Obsahuje-li klauzule REPLACING pouze volby ALL a CHARACTERS, bude se významný úsek prohledávat zleva doprava.) Takto je zaručeno, že po nahrazení některého bytu hlavní položky nemůže při dalším provádění téhož příkazu INSPECT dojít na téže znakové pozici k dalšímu nahrazení. d) Je-li v klauzuli REPLACING příkazu INSPECT uvedeno několik nahrazování, platí následující pravidlo: První uvedené nahrazování má k dispozici všechny byty významného (při volbě "interval": skutečného) úseku a změní některé byty tohoto významného úseku dle výše popsaných pravidel. Pro druhé uvedené nahrazování již nejsou k dispozici všechny byty významného úseku, nýbrž pouze doposud nezměněné byty významného úseku (a při volbě "interval" dokonce pouze ty z nich, které leží v příslušném skutečném úseku) a pouze v rámci těchto doposud nezměněných bytů se hledají všechny resp. vedoucí resp. koncové resp. první resp. poslední exempláře řetězce "arg1" resp. pouze těchto bytů se týká nahrazování při CHARACTERS. Při LEADING (ENDING) tedy nemusí posloupnost řetězců "arg1" začínat na začátku (končit na konci) skutečného úseku a nemusí být nepřerušená, pokud ovšem před (za) ní a uvnitř ní jsou pouze byty změněné pomocí prvního nahrazování (viz příklady). Podobně při FIRST (LAST) nemusí být vyhovující exemplář řetězce "arg1" skutečně první (poslední) ve skutečném úseku, pokud ovšem předchozí (následující) exempláře byly alespoň částečně změněny pomocí prvního nahrazování. Lze tedy říci, že se redukovaná podmnožina nezměněných bytů považuje za souvislou, ovšem víceznakový řetězec "arg1" musí být souvislý i v původním významném úseku. Pro třetí uvedené nahrazování jsou pak k dispozici pouze byty významného úseku nezměněné ani prvním ani druhým nahrazováním atd. Mimo jiné z toho vyplývá, že volba CHARACTERS může být sice uvedena spolu s jinými nahrazováními, má však smysl jedině jakožto poslední uvedené nahrazování (anebo s volbou "interval" užší než u následujících nahrazování) a znamená pak nahrazení všech znaků významného (resp. při volbě "interval": skutečného) úseku, které nebyly dosud změněny pomocí žádného z předešlých nahrazování. (Viz následující příklady.) Příklad: Nechť položka W má PIC X(12) a obsah AAAABBABACAB. a) INSPECT W REPLACING ALL 'A' BY '1' LEADING 'B' BY '2'. Vznikne W = 111122121C1B. b) INSPECT W REPLACING ALL 'A' BY '1' CHARACTERS BY '2'. Vznikne W = 111122121212. c) INSPECT W REPLACING LEADING 'A' BY '1' ALL 'A' BY '2'. Vznikne W = 1111BB2B2C2B. d) INSPECT W REPLACING LEADING 'A' BY '1' LEADING 'B' BY '2' Vznikne W = 111122ABACAB. e) INSPECT W REPLACING LEADING 'A' BY '1' FIRST 'B' BY '2'. Vznikne W = 1111BB2BACAB. f) INSPECT W REPLACING LEADING 'A' BY '1' CHARACTERS BY '2'. Vznikne W = 111122222222. g) INSPECT W REPLACING FIRST 'B' BY '1' ALL 'B' BY '2'. Vznikne W = AAAA12A2ACA2. h) INSPECT W REPLACING FIRST 'B' BY '1' FIRST 'B' BY '2' FIRST 'B' BY '3'. Vznikne W = AAAA12A3ACAB. i) INSPECT W REPLACING FIRST 'B' BY '1' CHARACTERS BY '2'. Vznikne W = 222212222222. j) INSPECT W REPLACING FIRST 'A' BY '1' LEADING 'A' BY '2'. Vznikne W = 1222BBABACAB. k) INSPECT W REPLACING FIRST 'A' BY '1' LEADING 'A' BY '2' FIRST 'A' BY '3'. Vznikne W = 1222BB3BACAB. l) INSPECT W REPLACING FIRST 'A' BY '1' FIRST 'A' BY '2' LEADING 'A' BY '3' FIRST 'A' BY '4' LEADING 'B' BY '5' ALL 'C' BY '6' LEADING 'A' BY '7'. Vznikne W = 12335545767B. Poznámka: V některých jiných implementacích jazyka COBOL mohou platit jiná pravidla ohledně příkazu INSPECT s několika ovlivňujícími se nahrazováními v klauzuli REPLACING (viz bod 4d) a proto doporučujeme takové příkazy INSPECT používat jen velmi opatrně. Poznámka: Výše uvedená pravidla o pořadí provádění jednotlivých úkonů jsou závazná jen z hlediska konečného výsledku; ve skutečnosti někdy pro zrychlení práce bude do jednoho prohledávání významného úseku spojeno několik úkonů, lze-li to provést bez narušení výše definované funkce příkazu INSPECT: a) S vyhledáním skutečného úseku lze spojit další úkony pouze tehdy, má-li volba "interval" typ BEFORE INITIAL nebo AFTER TERMINAL, přičemž příslušné úkony mají všechny touž volbu "interval" a všechny jsou buďto typu ALL s pevnou délkou řetězců 1 byte nebo typu CHARACTERS. Příkaz INSPECT nemůže obsahovat žádné další úkony. b) Do jednoho prohledávání významného úseku lze spojit několik úkonů počítání a případně i nahrazování, jsou-li všechny tyto úkony uvedeny v příkazu INSPECT bez přerušení za sebou, všechny mají touž volbu "interval", všechna počítání mají týž čítač a všechny úkony jsou buďto typu ALL s pevnou délkou řetězců 1 byte nebo typu CHARACTERS. c) Do jednoho prohledávání významného úseku lze spojit jedno počítání s jedním nahrazováním, jsou-li tyto úkony uvedeny v příkazu INSPECT bezprostředně za sebou, oba mají touž volbu "interval", oba jsou téhož typu ALL nebo LEADING nebo ENDING a mají týž "arg"; v příkazu INSPECT však nesmí být uvedena další nahrazování, která by měla délky řetězců větší než 1 byte nebo proměnné. (Pro takovéto dva úkony bude dokonce i dotaz na "arg" společný.) Příklad: Pro některé formáty příkazu EXAMINE uvádíme ten formát příkazu INSPECT, který má stejnou funkci: 1) EXAMINE P REPLACING ALL 'A' BY 'B' INSPECT P REPLACING ALL 'A' BY 'B' (Místo ALL by mohlo stát též LEADING, ENDING, FIRST nebo LAST.) 2) EXAMINE P TALLYING ALL 'A' REPLACING BY 'B' INSPECT P TALLYING TALLY = ALL 'A' REPLACING ALL 'A' BY 'B' (Místo ALL by mohlo stát též LEADING nebo ENDING.) 3) EXAMINE P TALLYING UNTIL FIRST 'A' REPLACING BY 'B' INSPECT P TALLYING TALLY = CHARACTERS BEFORE 'A' REPLACING CHARACTERS BY 'B' BEFORE 'A' 4) EXAMINE P TALLYING UNTIL LAST 'A' REPLACING BY 'B' INSPECT P TALLYING TALLY = CHARACTERS BEFORE TERMINAL 'A' INCLUDING REPLACING CHARACTERS BY 'B' BEFORE TERMINAL 'A' INCLUDING 5) EXAMINE P TALLYING AFTER FIRST 'A' REPLACING BY 'B' INSPECT P TALLYING TALLY = CHARACTERS AFTER 'A' INCLUDING REPLACING CHARACTERS BY 'B' AFTER 'A' INCLUDING 6) EXAMINE P TALLYING AFTER LAST 'A' REPLACING BY 'B' INSPECT P TALLYING TALLY = CHARACTERS AFTER TERMINAL 'A' REPLACING CHARACTERS BY 'B' AFTER TERMINAL 'A' Poznámka: Je vhodné si všimnout, že všechny výše uvedené příklady patří k jednomu z následujících dvou typů, což bude asi platit o téměř všech rozumných použitích příkazu INSPECT: a) Je uvedena volba ALL, LEADING, ENDING, FIRST nebo LAST, přičemž však není uvedena volba "interval". b) Je uvedena volba CHARACTERS a současně volba "interval". (Takže není-li skutečný úsek roven významnému úseku, provádí se pouze počítání nebo nahrazování všech znaků skutečného úseku.) Příklad: Změnu levostranných mezer na nuly u položek POCET, CENA a VAHA lze provést příkazem INSPECT POCET CENA VAHA REPLACING LEADING SPACE BY ZERO. Příklad: Nechť položka ALFA má obsah ABAABABAAB. Je-li I = 3 a J = 6, pak příkaz INSPECT ALFA POINTER I LENGTH J TALLYING K FOR ALL 'A' REPLACING ALL 'B' BY 'C' zpracovává pouze významný úsek AABABA (3.-8.byte) a tedy zvětší hodnotu položky K o 4 a položce ALFA dá nový obsah ABAACACAAB. Stejný účinek by měl i příkaz INSPECT ALFA POINTER 3 6 TALLYING atd. Příklad: Nechť položka BETA má obsah ABABABABA. Příkaz INSPECT BETA TALLYING I FOR ALL 'ABA' J = LEADING 'AB' K FOR ALL 'A' REPLACING ALL 'AB' BY 'CD' AFTER 'ABA' zvětší hodnotu I o 2, do J uloží hodnotu 4, zvětší hodnotu K o 5 a položce BETA dá nový obsah ABABCDCDA. Příklad: Nechť položka GAMA má obsah ABCBACAB. Příkaz INSPECT GAMA REPLACING ALL 'A' BY 'B' 'B' BY 'A' BEFORE TERMINAL 'C' dá položce GAMA nový obsah BACABCBB. (Interval "BEFORE TERMINAL 'C'" se vztahuje pouze k nahrazování "'B' BY 'A'" a nikoliv též k nahrazování "'A' BY 'B'".) Příklad: Příkaz INSPECT DELTA TALLYING N = ALL '0' ALL '1' ALL '2' ALL '3' ALL '4' ALL '5' ALL '6' ALL '7' ALL '8' ALL '9' REPLACING ALL '0' BY '*' '1' BY '*' '2' BY '*' '3' BY '*' '4' BY '*' '5' BY '*' '6' BY '*' '7' BY '*' '8' BY '*' '9' BY '*' uloží do položky N počet všech cifer v položce DELTA, načež změní všechny cifry v položce DELTA na hvězdičky.