10. TRANSFORM, EXAMINE, UFO, UFD A INSPECT 10.1. Příkaz TRANSFORM Formát: TRANSFORM položka... CHARACTERS FROM { položka | alf.literál | fig.konstanta } TO { položka | alf.literál | fig.konstanta } Funkce: Příkaz TRANSFORM způsobí změnu znaků v položkách uvedených za slovem TRANSFORM (říkáme jim transformované položky) podle pravidla definovaného pomocí údajů uvedených za slovy FROM a TO. Všechny položky uvedené v příkazu (tj. za TRANSFORM, za FROM i za TO) mohou být libovolného typu, zpracovávají se však vždy alfanumericky. Je-li za slovem FROM nebo za slovem TO uvedena figurativní konstanta, zpracovává se jako jednoznakový alfanumerický literál. Pravidlo: Příkaz TRANSFORM musí patřit k jednomu z těchto dvou typů: 1) Údaj uvedený za FROM a údaj uvedený za TO mají stejnou délku. Pak se u každé transformované položky každý znak, který je shodný s některým znakem údaje uvedeného za FROM (např. s jeho k-tým znakem zleva), nahradí tím znakem, který stojí v údaji uvedeném za TO na téže pozici (tj. k-tým znakem zleva v údaji uvedeném za TO). 2) Údaj uvedený za TO má pevnou délku jeden byte. Pak se u každé transformované položky každý znak, který je shodný s některým znakem údaje uvedeného za FROM, nahradí tím jediným znakem, z něhož se skládá údaj uvedený za TO. Je-li délka argumentu za FROM nebo za TO proměnná, netestuje se shoda okamžitých délek a příkaz se považuje vždy za syntakticky správný. Pokud údaj za TO nemá pevnou délku jeden byte, předpokládá se první typ; argument uvedený za TO se přitom využívá v té (pevné nebo proměnné) délce, kterou má argument uvedený za FROM. Příklad: Má-li položka ALFA PIC X(6) a obsah ABCADB, bude po provedení příkazu TRANSFORM ALFA FROM 'CFA' TO 'XYZ' mít obsah ZBXZDB. (Každé C se změní na X, každé F se změní na Y (nikterak nevadí, že v položce ALFA žádné F není) a každé A se změní na Z; ostatní znaky zůstávají nezměněny.) Příklad: 77 A PIC X(6) VALUE 'A65-T9'. 77 B PIC X(7) VALUE ALL '3N'. 77 C PIC S9(5) VALUE -1234. : TRANSFORM A B C FROM '0123456789' TO '*'. V položkách A, B a C se změní všechny znakové cifry na hvězdičky, bude tedy A = A**-T*, B = *N*N*N*, C = ****D; ostatní znaky zůstanou v položkách A, B a C nezměněny. Pravidla: a) Je-li délka údaje uvedeného za TO různá od délky údaje uvedeného za FROM a zároveň různá od jedné, přičemž jsou obě délky pevné, je příkaz TRANSFORM syntakticky chybný. b) Nemá-li údaj uvedený za FROM všechny své znaky navzájem různé, není obecně definováno, zda se z několika stejných znaků v údaji uvedeném za FROM uplatní první nebo poslední. (V našem COBOLu platí, že má-li argument za FROM pevnou délku nejvýše 20 bytů, pak první, jinak poslední. Tak např. u příkazu TRANSFORM POM FROM 'ABACA' TO '12345' se v položce POM změní všechna A na 1, všechna B na 2 a všechna C na 4; druhé a třetí A se neuplatní.) c) Příkaz TRANSFORM se provádí tak, že se postupně u všech transformovaných položek každý jejich znak srovnává se všemi znaky údaje uvedeného za FROM a při shodě se nahrazuje odpovídajícím znakem údaje uvedeného za TO, načež se přechází na další znak transformované položky. d) Je-li za FROM nebo za TO uvedena položka, pracuje příkaz TRANSFORM stejně, jako kdyby místo této položky stál literál o stejné délce a stejném obsahu. Tato položka může během výpočtu měnit svou hodnotu, takže týž příkaz TRANSFORM může při každém svém provádění provádět jinou transformaci. e) Pokud při provádění příkazu TRANSFORM dojde ke změně údaje za FROM nebo za TO (může k tomu dojít v případě, že tento údaj je položkou mající společné byty s některou z transformovaných položek), není obecně definováno, zda se tím změní nebo nezmění transformační pravidlo pro následující byty téže transformované položky a pro případné další transformované položky. (V tomto COBOLu platí, že má-li údaj za FROM pevnou délku 2 až 20 bytů, pak jeho změna nebo změna údaje za TO (kromě případu, že má pevnou délku 1 byte) způsobí změnu transformačního pravidla, jinak se transformační pravidlo nezmění. Tak např. při provádění příkazu TRANSFORM A B FROM A TO SPACE při pevné délce položky A mezi 2 a 20 byty způsobí změna položky A změnu transformačního pravidla pro položku B, takže náš příkaz TRANSFORM bude ekvivalentní s příkazy TRANSFORM A FROM A TO SPACE TRANSFORM B FROM A TO SPACE zatímco při délce položky A 1 byte nebo více než 20 bytů nebo proměnné ke změně transformačního pravidla nedojde.) f) Místo příkazu TRANSFORM, v němž údaj za FROM i údaj za TO mají pevnou délku 1 byte, lze použít též příkaz EXAMINE s REPLACING ALL, přičemž přeložený program bude přesně stejný. Pro nejčastěji požadovanou změnu levostranných mezer na nuly u načteného numerického údaje není ovšem vhodný žádný z těchto dvou příkazů (neboť změní na nuly i mezery mezi číslicemi nebo za číslicemi), nýbrž příkaz EXAMINE s REPLACING LEADING. Poznámka: Příkaz TRANSFORM se v praxi používá jen zcela výjimečně.