Her en dag hadde jeg behov for å bytte ut et par tegn i en tekststreng, og siden dette ikke akkurat er en innebygget funksjon i fortran bestemte jeg meg for å skrive min egen. Men først, hva betyr det egentlig å bytte ut et par tegn i en tekststreng?
En tekststreng, eller en string som man sier på engelsk, er rett og slett en serie med tegn som man kan håndtere i et programmeringsspråk. Jeg holder egentlig på å skrive en artikkel om datatyper, og da kommer jeg litt tilbake til dette, men for øyeblikket kan vi tenke på det som bokstaver, tall og andre tegn, pakket i hermetegn. For eksempel:
a = 'elefant'
er python-kode for å si at a er en variabel som inneholder teksten «elefant». Det jeg vil gjøre er å erstatte en substreng i denne strengen med en annen streng. Hvis jeg for eksempel erstatter
'e' med
'o' blir resultatet
'olofant'.
(Egentlig kunne jeg tenke meg å være veldig generell, så jeg skrev en funksjon som erstatter alle instanser av én substreng med en annen streng av vilkårlig lengde, men på grunn av mangelfull implementering av Fortran 2003 i GCC 4.7 (den støtter ikke variabler i allocate-statements for allokering av strenger, som så vidt jeg kan skjønne koker ned til at du må vite lengden på strengen når du kompilerer.) så jeg meg nødt til å begrense meg til å erstatte en substreng med en annen streng av samme lengde, slik at lengden på strengen du erstatter i blir uendret.)
Etter å ha programmert dette begynte jeg naturligvis å teste koden, og etter å ha luket ut de naturlige feilene (mangelfull håndtering av mellomrom, uendelig løkke hvis du erstatter en substreng med en streng som inneholder substrengen selv, etc.) begynte jeg å klø meg i hodet for å komme på noen enda særere spesialtilfeller å teste. Det falt meg inn at man kunne se for seg å prøve å erstatte den tomme strengen med noe, som i pseudokode for eksempel kan se omtrent slik ut:
erstatt alle tilfeller av '' i 'elefant' med ' '
Jeg heller mot at svaret her skal være uendelig mange mellomrom (eventuelt en feilmelding, hvis man foretrekker et pysete programeringsspråk), siden det er plass til uendelig mange tomme strenger i en hvilkensomhelst annen streng (sagt på en mer tungvindt måte, den tomme strengen er identitetselementet i konkatenering).
Jeg sjekket hva python gjør, og ble egentlig litt overrasket over å se at
'elefant'.replace('', ' ')
gir
' e l e f a n t '
Hvem bestemte at det finnes nøyaktig én tom streng mellom hvert tegn og på endene i en ikke-tom streng? Virker litt sært, spør du meg, så jeg gikk for å ikke endre strengen hvis man ber om å erstatte den tomme strengen med noe. Det er kanskje ikke optimalt det heller, siden man kunne tenke seg å gjøre noe slikt som
erstatt alle tilfeller av '' i '' med 'elefant'
og forvente å få
'elefant', og det finnes jo noe som heter The principle of least surprise, som sier at man bør gjøre det brukeren mest sannsynlig forventer, men jeg holder likevel en knapp på min løsning.
Såh. Jeg husker ikke helt hva jeg ville med denne artikkelen, men den kan kanskje fungere som en illustrasjon på en liten del av hverdagen til en numerisk fysiker.
Comments