Programmeren in REXX/Functies deel 1
In dit hoofdstuk gaan we dieper in op een eerste reeks functies die standaard aanwezig zijn in REXX.
Vermits REXX in de eerste plaats een karakter georiënteerde taal is, is het dan ook niet verwonderlijk dat veel functies strings behandelen. REXX kent ook de notie "woorden" zodat er ook daarvoor specifieke functies zijn.
De parameters die tussen vierkante haakjes worden genoteerd zijn optioneel. Er wordt in die gevallen een standaardwaarde (default value) aangenomen. Deze is dan onderlijnd. Veel functies voorzien ook in een pad-parameter. De term heeft niets met een soort kikker te maken, maar komt van het Engelse werkwoord "to pad", in de betekenis van opvullen of verlengen. Het pad-karakter zal meestal dienen om het resultaat aan te vullen tot een gevraagde lengte. Daar de standaardwaarde voor een pad-karakter steeds een spatie is noteren we niet telkens meer [pad | " "], maar kortweg [pad].
Manipulatie van strings
Strings zijn dus karakterreeksen waarin alle mogelijke karakters ('00'x tot 'FF'x) kunnen voorkomen, inclusief spaties of controlekarakters.
SUBSTR - Deel uit geheel halen
substr(bron-string,start[,lengte][,pad])
Deze functie haalt een deel (sub-string) uit een bron-string. De bronstring is het resultaat van een voorafgaande interpretatie. Het gedeelte dat eruit gehaald moet worden begint bij de start-positie en krijgt een lengte. Indien lengte niet is opgegeven dan wordt de rest van de string genomen. Indien de lengte groter is dan het aantal karakters dat overblijft in de bronstring wordt het resultaat verlengd met het pad-karakter.
Dit zijn voorbeelden:
zin='Dit is een volzin' say substr(zin,5,2) «is» say substr(zin,10,4) «n vo» say substr(zin,10,4,"-") «n vo» say substr(zin,15,8,"-") «zin-----» say substr(zin,15,8) «zin » say substr(zin"!",15,6) «zin! » say substr('Hallo',4) «lo»
In het derde voorbeeld heeft het pad-karakter geen invloed. In het vierde geval wél, want er is niet genoeg materiaal meer in de zin om een string van 8 karakters te produceren, en dus moeten pad-karakters worden toegevoegd. In het vijfde voorbeeld is geen pad-karakter opgegeven, dus worden spaties toegevoegd. Het resultaat is wel degelijk 8 karakters lang!
Het voorlaatste voorbeeld toont dat de bron complex kan zijn. Bij het laatste voorbeeld is geen lengte opgegeven, zodat het resultaat alles vanaf beginpositie 4 tot het einde van de string bevat.
LENGTH - Lengte van een string bepalen
length(string)
Geeft de lengte van de string terug.
say length('Dit is een zin') «14»
LEFT - Linker deel uit een string halen
left(string,aantal[,pad])
Hiermee halen we aantal karakters uit de string, te beginnen bij het eerst karakter. Indien het aantal groter is dan de string, dan wordt het resultaat verlengd met het pad-karakter.
say left("Dit is een zin",3) «Dit» say left("Hallo",8,"-") «Hallo---»
RIGHT - Rechter deel uit een string halen
right(string,aantal[,pad])
Dit is, hoe kan het ook anders, het omgekeerde van left.
say right("Hallo",8,'-') «---Hallo»
STRIP - Een string afknippen
strip(string[,optie | "Both"][,karakter | " "])
Deze functie elimineert alle spaties (of opgegeven karakter)
- zowel vooraan als achteraan de string met optie B[oth] (standaardoptie);
- enkel vooraan de string met optie L[eading] (leidend), of
- enkel achteraan de string met optie T[railing] (volgend).
say strip(' Hallo ') «Hallo» say strip(' Hallo ','L') «Hallo » say strip('***Hallo***','Both','*') «Hallo»
REVERSE - Een string omkeren
reverse(string)
Keert de string eenvoudigweg om.
zin='Dit is een zin' say reverse(zin) «niz nee si tiD»
COPIES - Een string herhalen
copies(string,aantal)
Retourneert een string die de oorspronkelijke string een aantal maal herhaalt. Er komen geen extra tussenliggende spaties bij !
say copies('=',10) «==========» say copies(' ',10) « » say copies("-§-",3) «-§--§--§-»
POS - Eerste positie van een substring in een string zoeken
pos(naald,hooiberg[,start | 1])
POS geeft de eerste positie van de naald in de hooiberg. Normaal wordt vanaf de eerste positie gezocht, maar men kan optioneel pas vanaf de positie start beginnen zoeken. Wordt er niets gevonden, dan is het antwoord 0 (nul).
Bestand="d:\rexxprogrammas\test1.rex" say pos(':',bestand) «2» say pos('\',bestand,6) «18» say pos('-',bestand) «0» say pos('mm',bestand) «14»
De naald niet beperkt tot één karakter, zoals men kan leren uit het laatste voorbeeld.
LASTPOS - Laatste positie van een substring in een string zoeken
lastpos(naald,hooiberg[,start | 1])
Zoals men kan verwachten is deze functie het omgekeerde van de functie pos.
Bestand="d:\rexxprogrammas\test1.rex" say lastpos('\',bestand) «18» say lastpos("",bestand) «0»
Merk op dat indien de opzoekterm een lengte 0 heeft het antwoord ook 0 is. Wie verwacht immers iets te vinden als men op zoek gaat naar niets ?
Voor een string zonder lengte of een lege string gebruiken we vanaf nu de Engelse term nullstring. |
SPACE - Een string opschonen
space(string[,aantal | 1][,pad])
Geeft de oorspronkelijke string terug, doch met telkens hetzelfde aantal spaties of pad-karakters tussen elk woord. We kunnen dus ook alle spaties wegnemen door het aantal op nul te zetten.
say space('Dit is een zin') «Dit is een zin» say space('5 17 3',2,'+') «5++17++3» say space('Dit is een zin',0) «Ditiseenzin»
CENTRE - Een string centreren
centre(string,lengte[,pad])
Deze functie maakt een lijn van de opgegeven lengte waarin de string gecentreerd is. Aan beide zijden worden m.a.w. evenveel spaties (of pad-karakters) toegevoegd. Als de lengte kleiner is dan de string, dan worden er aan beide zijden karakters weggenomen.
Mike Cowlishaw, die REXX in zijn vrije tijd ontwikkelde is een Engelsman. Daarom noemde hij deze functie "centre". Doch, toen het als officieel product door de IBM laboratoria in de VS moest worden onderhouden heeft men het synoniem center moeten toevoegen om te voldoen aan de Amerikaanse schrijfwijze. We kunnen dus beide gebruiken.
say center('Hello',10) « Hello » say centre('Hello',3) «ell»
COMPARE - Strings vergelijken
compare(string1,string2[,pad])
Met deze functie kunnen we 2 strings met elkaar vergelijken. De kortste wordt even lang gemaakt als de langste met het pad-karakter. Als beide strings dan identiek zijn is het resultaat 0 (nul). Anders geeft de functie de positie van het eerste karakter dat verschillend is. Kleine- en hoofdletters hebben hierbij belang !
say compare('Hello','Hallo') «2» say compare('Hello ','Hello') «0» say compare('Hello ','Hello',"-") «6»
INSERT - Een stukje toevoegen in een string
insert(nieuw,string[,start | 1][,lengte][,pad])
Schuift het nieuw stukje in de string, na de start-positie. Het toegevoegde stukje wordt eventueel verlengd tot lengte door er pad-karakters aan toe te voegen.
say insert(' is','Diteen zin',4,4,' ') «Dit is een zin» say insert(' is','Diteen zin',,4) « is Diteen zin»
OVERLAY - Een stukje van een string overschrijven
overlay(nieuw,string[,start | 1][,lengte][,pad])
De functie overlay zal een nieuw stukje over de bestaande string plakken, beginnend bij positie start. Het nieuwe stukje kan eerst worden verlengd tot lengte door er pad-karakters aan toe te voegen.
say overlay('is','Dit was een zin',5,3) «Dit is een zin» say space(overlay('is ','Dit was een zin',5)) «Dit is een zin»
In het tweede voorbeeld hebben we twee functies in elkaar gevlochten. De binnenste functie wordt eerst uitgevoerd. Ze geeft in dit geval «Dit is een zin» terug, dus met 2 spaties na het woord "is". Het resultaat wordt dan door de buitenste functie verwerkt en reduceert de spaties tot één enkel blanco karakter.
DELSTR - Een deel uit een string wegknippen
delstr(string,start[,aantal])
Knipt een aantal karakters uit de string', te beginnen bij start. Als geen aantal is opgegeven elimineert de functie de rest van de bronstring.
say delstr('Dit is een zin',5,3) «Dit een zin» say delstr('Jan Klaas',4) «Jan»
VERIFY - Uit welke karakters is een string opgebouwd ?
verify(string,referentie[,optie | "Nomatch"][,start | 1])
Met verify kunnen we nagaan of onze string is opgebouwd uit karakters die in de referentie staan. De controle begint aan start als die parameter is opgegeven. Indien aan deze voorwaarde is voldaan, dan is het antwoord 0 (nul). In het ander geval is het antwoord
- de eerste positie in string die niet voldoet als de optie Nomatch is opgegeven (dit is de standaard optie).
- de eerste positie in string die wél voldoet als optie Match is opgegeven.
Zo laat deze functie bijvoorbeeld toe na te gaan of een string enkel cijfers bevat.
say verify("142536","0123456789") «0» say verify("1425A6","0123456789") «5»
We kunnen ook zoeken naar de positie van het eerste karakter dat wél in de referentie staat:
say verify("Jan Klaas;Hoogweg, 7;Ergenstevelde",";,/","Match") «10»
In dit voorbeeld is onze bron typisch voor een lijn uit een zogenaamd CSV-bestand (Comma Separated Values). Dit is een bestand dat door spreadsheet programma's kan worden aangemaakt of gelezen. Tussen elk veld staat een scheidingsteken. Maar dat scheidingsteken is niet noodzakelijk een komma zoals de naam laat uitschijnen. Als in een veld een komma kan voorkomen moet wel voor een ander scheidingteken gekozen worden. In ons voorbeeld gaan we op zoek naar het eerste karakter dat een komma, punt-komma of slash is. We veronderstellen dan dat dit karakter als scheidingsteken gebruikt wordt. Een aandachtig lezer zal echter inzien dat dit geen sluitende test is. Lees hier om meer te leren over CSV-bestanden.
ABBREV - geldige afkorting
abbrev(informatie,info[,lengte])
Deze functie geeft de waarde 1 (waar) als info gelijk is aan het begin van informatie en niet korter is dan lengte (als opgegeven). Anders is het antwoord 0 (onwaar). De standaardlengte is gelijk aan de lengte van de info parameter.
say abbrev("Print","Pri") «1» say abbrev("PRINT","Pri") «0» say abbrev("PRINT","PRI",4) «0» say abbrev("PRINT","") «1»
Merk op dat een nullstring steeds voldoet als geen lengte is opgegeven. Het volgende stukje programma is daarom een manier om een standaardwaarde te kiezen als geen optie is meegegeven met het programma:
/* Programma met standaardoptie */ parse upper arg optie . select /* eerste when bepaalt de standaardwaarde */ when abbrev("PRINT",optie) then ... /* printen */ when abbrev("COPY",optie) then ... /* kopiëren */ ... otherwise nop; end
Als de gebruiker van dit programma geen optie meegeeft, dan zal de eerste when abbrev("PRINT","") dus steeds voldoen.
Werken met woorden
Met woorden bedoelen we groepjes aaneengesloten karakters die van elkaar gescheiden zijn door één of meer spaties. De woorden kunnen alle karakters bevatten, behalve de spatie natuurlijk.
Op personal computers bestaat een conventie dat een tekst eindigt bij de eerste '00'x, maar voor REXX geldt die conventie niet en maken '00'x karakters dus deel uit van de string. |
In de voorbeelden hieronder veronderstellen we steeds dat zin staat voor "Dit is een zin.".
WORD - Eén woord uit een zin ophalen
word(zin,n)
Geeft het n-de woord uit de zin terug.
say word(zin,3) «een»
SUBWORD - Woorden uit een zin ophalen
subword(zin,n[,aantal])
Het resultaat bevat alle (of een opgegeven aantal) woorden te beginnen bij het n-de woord uit de zin.
say subword(zin,3) «een zin.» say subword(zin,2,2) «is een» say subword(zin,3,5) «een zin.»
WORDS - Aantal woorden in een zin
words(zin)
Geeft, zoals te verwachten valt, het aantal woorden in de zin. In ons geval 4 dus.
DELWORD - Woorden uit een zin elimineren
delword(zin,n[,aantal])
Het resultaat van deze functie is de oorspronkelijke zin waaruit een aantal woorden, te beginnen bij het n-de woord, zijn verwijderd. Indien we geen aantal opgeven, dan elimineren we alle resterende woorden (en niet enkel 1 zoals men zou kunnen denken).
say delword(zin,2,2) «Dit zin.» say delword(zin,2) «Dit»
WORDLENGTH - Lengte van een woord in een zin
wordlength(zin,n)
Geeft de lengte van het n-de woord in de zin. Als er geen n-de woord is, dan is de lengte uiteraard nul.
say wordlength(zin,3) «3»
WORDINDEX - Positie van een woord in een zin
wordindex(zin,n)
Vertelt op welke karakterpositie het n-de woord in de zin begint.
say wordindex(zin,4) «12»
WORDPOS - Plaats van een woord in een zin
wordpos(zoekterm,zin[,n | 1])
Zegt ons het hoeveelste woord zoekterm in de zin is. Eventueel kan men de zoektocht beginnen bij het n-de woord. Is de string niet gevonden dan is het antwoord uiteraard nul. De zoekterm kan uit één of meer woorden bestaan.
say wordpos("een",zin) «3» say wordpos("of",zin) «0» say wordpos("zin.",zin,2) «4» say wordpos("zin",zin) «0» say wordpos("een",zin,5) «0» say wordpos("is een",zin) «2»
Met het vierde voorbeeld leren we dat we wel degelijk naar een woord zoeken, want niet "zin" maar "zin." komt als woord in de bron voor. Het laatste voorbeeld toont dat we kunnen zoeken met een zinnetje. Meer zelfs, de spaties in de zoekterm hebben daarbij geen belang.