Olen kyllä vannoutunut Pythonin suosija enkä Perliin mielelläni kajoa, mutta... Sain eilen lopulta ratkaistuksi pitkään kiusanneen ongelman, joka osoitti, kuinka vahvaa Perlin sääntölausekkeiden käsittely on. Olkoon siis opiksi ja ojennukseksi kaikille!
Tavoitteena oli muuttaa URLeissa olevia kyselylausekkeita tekstiksi. Kyselylausekkeissa mm. ääkköset oli merkitty muotoon % + heksaluku, siis esim. ä = %e4.
Perlillä homma menee näin:
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Ts. etsitään %
heksaluku-jonot, joista itse heksaluku merkitään ryhmäksi suluin, ja sitten muutetaan luku vastaavaksi merkiksi. Taikatempun tekee s-operaattorin e-valitsin, jonka ansiosta korvaava merkkijono voi olla suoritettava lauseke.
Pythonilla homma
ei mene kuten seuraavassa esimerkissä, koska re.sub-funktion toisen argumentin on oltava literaali merkkijono – jos merkkijonoa yrittää jatkokäsitellä funktiossa, \
n-viittaukset menettävät ”taikansa":
value = re.sub(r'%([A-Fa-f0-9][A-Fa-f0-9])', chr(int('\1', 16)), value)
Mutta tokihan myös re.subissa on taikakonsti: jos kakkosargumenttina on funktio (ei siis kutsu vaan viittaus), sitä funktiota kutsutaan suorittamaan muunnos; ja toki funktiona voi olla myös lambda, kuten tässä:
value = re.sub(r'%([A-Fa-f0-9][A-Fa-f0-9])', lambda m: chr(int(m.group(1), 16)), value)
Hoituuhan tuo siis Pythonillakin, mutta kyllä on myönnettävä sääntölausekkeiden käsittelyn olevan koko lailla vaivattomampaa Perlissä – niin ällö kieli kuin muuten onkin
