15.2. Příkaz REPLACE Funkce: Příkaz REPLACE mění následující část zdrojového programu. Formát 1: REPLACE [ADD] {slovo-1 {BY|WITH} slovo-2} ... . Formát 2: REPLACE OFF [slovo-1]. Pravidla: 1) Pravidla 1, 2 a 9 uvedená pro příkaz COPY platí i pro příkaz REPLACE. 2) Příkaz REPLACE musí být vždy ukončen tečkou. 3) Uvnitř příkazu REPLACE (tzn. mezi slovem REPLACE a tečkou ukončující příkaz REPLACE) nesmí být uvedeno slovo COPY ani REPLACE jakožto slovo-1 nebo slovo-2, ani zde nesmí začínat další příkaz REPLACE. Smí zde však začínat (a případně i končit) příkaz COPY: pak příkaz REPLACE pokračuje ve zdrojovém textu zařazeném tímto příkazem COPY a končí na první nalezené tečce, jež se může nacházet v zařazeném COPY-textu anebo až po jeho ukončení na téže "úrovni vnoření" jako slovo REPLACE. Např. při zápisu REPLACE A BY A1 COPY JAN. D BY D1. kde text JAN obsahuje jediný řádek "B BY B1 C BY C1" se přijímá "REPLACE A BY A1 B BY B1 C BY C1 D BY D1.". Naproti tomu při zápisu REPLACE A BY A1 COPY JOSEF. MTZ3A027. kde text JOSEF obsahuje tři řádky B BY B1 C BY C1. IDENTIFICATION DIVISION. PROGRAM-ID. se přijímá "REPLACE A BY A1 B BY B1 C BY C1.". 4) Rovněž je přípustné, aby příkaz REPLACE začínal ve zdrojovém textu zařazeném příkazem COPY a pokračoval i po jeho ukončení. Např. při zápisu COPY JAKUB. C BY C1 D BY D1. kde text JAKUB končí řádkem "REPLACE A BY A1 B BY B1" se přijímá "REPLACE A BY A1 B BY B1 C BY C1 D BY D1.". 5) Příkaz COPY v bodech 3 a 4 by mohl mít klauzuli REPLACING, která by mohla měnit též tu část příkazu REPLACE, která je částí zdrojového textu (s výjimkou samotného slova REPLACE). Funkce: 1) Formát 1 příkazu REPLACE způsobí, že následující část zdrojového programu včetně případných zdrojových textů zařazovaných pomocí příkazů COPY (s výjimkou těchto příkazů COPY samotných), a to až do nejbližšího takového příkazu REPLACE, který by účinek našeho příkazu REPLACE zrušil (viz body 2 a 3; nenásleduje-li již žádný příkaz REPLACE, pak až do konce zdrojového programu), bude změněna stejným způsobem, jak by to způsobila klauzule REPLACING v příkazu COPY s týmiž slovy-1 a slovy-2. 2) Nový příkaz REPLACE formátu 1 bez volby ADD ukončuje účinnost předcházejícího příkazu (resp. předcházejících příkazů) REPLACE, takže za ním následující část zdrojového programu bude změněna výhradně tak, jak to zadává tento nový příkaz REPLACE. Naproti tomu nový příkaz REPLACE s volbou ADD ponechá v účinnosti dosavadní příkaz resp. příkazy REPLACE a přidá své dvojice "slovo-1 BY/WITH slovo-2" za dosavadní dvojice, takže na následující část zdrojového programu se budou aplikovat stará i nová nahrazování. (A to jakoby staré i nové dvojice byly uvedeny v témže jediném příkazu REPLACE: je-li totéž slovo-1 uvedeno ve starém i v novém příkazu REPLACE, nahrazuje se pouze dle starého (!) příkazu REPLACE.) Nebyl-li účinný žádný příkaz REPLACE, nemá slovo ADD žádný účinek. 3) Příkaz "REPLACE OFF." ruší účinnost předcházejícího příkazu resp. předcházejících příkazů REPLACE (nebyly-li žádné, nevadí), aniž by definoval nějaká nová nahrazování. Příkaz "REPLACE OFF slovo-1." je přípustný jen tehdy, je-li mezi dosud účinnými nahrazováními definovanými předcházejícími příkazy REPLACE též nějaké "slovo-1 BY/WITH slovo-2" (s týmž slovem-1 jako za OFF; je-li takových nahrazování více, vezme se první z nich). Příkaz "REPLACE OFF slovo-1." pak zruší toto nahrazování i všechna nahrazování definovaná po něm, zatímco nahrazování definovaná před ním ponechá v platnosti. Příklad: REPLACE A BY A1 B BY B1 C BY C1 D BY D1. : &nahrazuje se A,B,C,D REPLACE OFF C. &ruší se nahrazování C a D : &nahrazuje se A,B REPLACE AD E BY E1 F BY F1. &A,B zůstává : &nahrazuje se A,B,E,F REPLACE OFF G. &syntaktická chyba, ignoruje se REPLACE OFF E. &ruší se nahrazování E a F : &nahrazuje se A,B REPLACE OFF E. &syntaktická chyba, ignoruje se REPLACE ADD G BY G1. &A,B zůstává, G se přidává : &nahrazuje se A,B,G REPLACE OFF B. &ruší se nahrazování B a G : &nahrazuje se jen A REPLACE H BY H1 I BY I1. &nahrazování A se ruší : &nahrazuje se H,I REPLACE OFF. &ruší se všechna nahrazování : &nenahrazuje se nic REPLACE ADD J BY J1. &ADD se ignoruje : &nahrazuje se J Příklad: Pomocí příkazu COPY zařazujeme zdrojový text, v němž si chceme definovat nějaká nahrazování používaná pouze v tomto textu, např. "POCET BY 100 NAZEV WITH 'PRAHA'" (třeba proto, abychom při změně nemuseli opravovat všechna místa v textu, kde se literál 100 resp. 'PRAHA' vyskytuje, nýbrž aby stačilo opravit jediné místo; pak POCET a NAZEV jsou vlastně symbolickými názvy literálů 100 a 'PRAHA'). Přitom ovšem nesmíme zrušit případná dříve definovaná nahrazování platná v základním zdrojovém programu. Zařídíme to tak, že umístíme na začátek textu příkaz "REPLACE ADD POCET BY 100 NAZEV WITH 'PRAHA'." a na konec textu příkaz "REPLACE OFF POCET.", jenž zruší právě obě nahrazování definovaná na začátku zdrojového textu a obnoví tím stav nahrazování platný při COPY. (Musí být ovšem zaručeno, že slova POCET a NAZEV nebyla nahrazována již dříve, a ve zdrojovém textu nám nesmí vadit případná dříve definovaná (a tedy i v rámci zdrojového textu účinná) nahrazování.) 4) Obsahuje-li zdrojový program jak příkazy REPLACE, tak i příkazy COPY, bude výsledek takový, jakoby se nejprve aplikovaly všechny uvedené příkazy COPY (včetně "vnořených") a zařadily se příslušné zdrojové texty (přičemž by se aplikovaly všechny klauzule ATTRIBUTE a REPLACING těchto příkazů COPY), načež teprve na takto vzniklý zdrojový program by se aplikovaly uvedené příkazy REPLACE. Platí však, že slovo změněné účinkem klauzule ATTRIBUTE nebo REPLACING některého příkazu COPY již nemůže být dále změněno účinkem příkazu REPLACE (takže každé slovo může být změněno nejvýše jednou). Odtud mimo jiné plyne: a) Účinek příkazu REPLACE není ukončen ani ovlivněn začátkem ani ukončením zdrojového textu zařazovaného příkazem COPY, a to ani v případě, že sám příkaz REPLACE je obsažen v tomto zdrojovém textu. Takovýto příkaz REPLACE bude tedy aplikován na následující část tohoto zdrojového textu a pak na následující část zdrojového programu včetně všech dále zařazovaných zdrojových textů, a to až do nového příkazu REPLACE resp. do konce zdrojového programu. b) Příkaz REPLACE se neaplikuje na žádný z příkazů COPY ani REPLACE (tj. na slova počínaje slovem COPY/REPLACE až po tečku ukončující příkaz COPY/REPLACE). Obráceně však příkaz REPLACE (jakož i příkaz COPY) může být změněn účinkem klauzule REPLACING v příkazu COPY, leží-li ve zdrojovém textu zařazovaném takovým příkazem COPY. (Pouze samotné slovo COPY resp. REPLACE nemůže být změněno, neboť nesmí být uvedeno v klauzuli REPLACING jakožto slovo-1.) c) Klauzule ATTRIBUTE a REPLACING v příkazech COPY se aplikují přednostně před příkazem REPLACE, a to nezávisle na tom, který z příkazů COPY resp. REPLACE byl uveden dříve. 5) Slova změněná účinkem příkazu REPLACE se (při použití BY) v protokolu tisknou ve změněném tvaru stejně jako slova změněná účinkem klauzule REPLACING v příkazu COPY. Příklad: Do adresáře katalogizujme text ZKRATKY tvaru REPLACE P BY PIC V BY VALUE C BY COMP C3 BY COMP-3. Na začátku zdrojového programu uvedeme "COPY ZKRATKY.", čímž zařadíme text ZKRATKY a uvedeme v činnost jeho nahrazování. Chceme-li přidat další nahrazování, učiníme to např. příkazem REPLACE ADD O BY OCCURS R BY REDEFINES. Píšeme pak "77 A R P 9(5) C3 V 0." nebo "02 B P 99 C O 20.". Pro oddíl procedur již tato nahrazování nepotřebujeme a proto je všechna zrušíme a zavedeme si jiná: PROCEDURE DIVISION. REPLACE M BY MOVE P BY PERFORM C BY COMPUTE. Píšeme pak "M A TO B", "P ZPRAC", "P VARYING I UNTIL I>J", "C A(I)=B(I)+1" apod. Nevýhodou je, že nemůžeme popsat položky se jmény P, V, C, C3, O, R, M.