MainframeSupports
tip uge 23/2001:

Der er rigtig mange indbyggede funktioner i PL/1, selv om jeg mener at huske, at der er endnu flere i REXX. En af de rigtig brugbare af slagsen er VERIFY. VERIFY benyttes typisk til at finde ud af, om en tegnstreng indeholder en bestemt slags tegn. Eksempelvis vil VERIFY(X, '0123456789') returnere 0, hvis X udelukkende indeholder cifre. Hvis et af tegnene i X ikke er et ciffer, så vil VERIFY returnere positionen på det første tegn i X, der ikke er et ciffer.

Med denne viden i baghånden er det let at lave et udtryk, der fjerner foranstillede blanke fra en tegnstreng. Følgende udtryk returnerer en tegnstreng, hvor eventuelle foranstillede blanke i X er fjernet.

SUBSTR(X, VERIFY(' ' !! X, ' ') - 1)

For at sikre, at VERIFY ikke returnerer 0, så sætter jeg en blank ind foran X. Se det er da ret elegant. Jeg benytter dette trick til at venstrestille FIXED BINARY variable, når de skal indgå som en del af en tegnstreng:

DCL x CHAR(15) VAR;
DCL integer FIXED BIN(31);
...
x = ' ' !! integer;
x = substr(x, verify(x, ' '));
PUT SKIP LIST('Integer = ' !! x !! ' er lige i overkanten.');

Læg mærke til, at med udtrykket X = ' ' !! INTEGER konverterer PL/1 selv fra FIXED BINARY format til en tegnstreng. Fidusen ved at sætte en blank ind allerede her er, at man undgår warning "Data conversion will be done by subroutine call", selv om jeg er ret sikker på, at PL/1 gør det alligevel.

Man kunne godt have skrevet udtrykket direkte ind på X'ets plads i PUT SKIP LIST, men så ville du jo ikke se, hvordan man kan gemme INTEGER i en tegnstreng venstrestillet. Hvis man skriver INTEGER på X'ets plads i PUT SKIP LIST, så får man en masse foranstilede blanke med. Det er også værd at bemærke, at hvis X erklæres mindre end 15 tegn lang, så skærer PL/1 cifre af bagfra.

Forrige danske tip        Last tip in english        Tip oversigten