Korpusten käsittely clt131, P2 2006 Luento 5 Nicholas Volk <nvolk@ling.helsinki.fi> 1.12.2006 Humanistinen tiedekunta
Perl Perl niminen ohjelmointikieli mahdollistaa tekstin monipuolisen muokkaamisen helposti Kursilla käytetään Perliä vain komentoriviltä Käytämme vain kahta kielen käskyä: s/// ja tr/// Oikeaa ohjelmointia opetetaan sitten myöhemmin toisaalla... Meille riittää Perlin käyttö komentorivillä muodossa $ perl pe 'käsky;'
Perlin pe option Optio e tarkoittaa, että suoritettava ohjelma tulee sijaitsee komentorivillä, ei jossain tiedostossa Optio p luo annettujen käskyjen ympärille implisiittisesti silmukan, jossa ensin luetaan rivit yksi kerrallaan, sitten tehdään halutut käskyt ja lopuksi (muokattu) rivi tulostetaan (ei tarvitse ymmärtää): while (<>) { käsky1; käsky2; käskyn; } continue { print $_; }
Merkkijonon korvaaminen toisella: s/// Annetun merkkijonon voi korvata toisella seuraavasti: perl pe 's/vanha/uusi/;' (Tällaisenaan komento korvaa vain kunkin rivin ensimmäisen osuman) Käskyjä voi olla useampi peräkkäin, puolipiste (oikeassa paikassa) tarkoittaa erotinta: perl pe 's/vanha/uusi/; s/pois//;' Yllä merkkijono 'pois' korvattiin ei millään eli se poistettiin (Puolipiste on myös komentotulkin komentojen erotin)
s/foo/bar/g; s/// käskyn foo osa on säännöllinen lauseke ja bar osa lausekkeen korvaava merkkijono Erotinmerkki '/' merkitään laittamalla sen eteen kenoviiva s/// käskyn optiot kirjoitetaan kolmannen jakoviivan perään Option g avulla rivillä voi olla useampiakin osumia perl pe 's/uusi/vanha/g;'
Ryhmittely Ryhmittelyn avulla voidaan ilmaista vaihtoehtoisuutta: perl pe 's/fabianink(\. atu) 28/Siltavuorenpenger 20/g;' Sulkujen sisälle rajatut merkkijonot tallettuvat Perlin erityismuuttujiin $1... $9: perl pe 's/([\.!\?]) ([A ZÅÄÖ])/$1\n$2/g; Muutujan nimi pitää ympyröidä hakasuluilla ${1}, jos seuraava merkki kuuluu joukkoon [0 9_a za Z] $1 sisältää ensimmäisenä alkaneen alueen, $2 toisen jne. perl pe 's/((h[aeio]h?)+)/$1 $2/;'
Muuttujat $&, $` ja $' Muuttuja $& saa s/// käskyssä arvokseen koko osuman Käskyt s/sana/=$&=/g; ja s/(sana)/=$1=/g; tekevät täsmälleen saman asian $` viittaa osumaa edeltäneeseen merkkijonoon $' viittaa osuman jälkeiseen merkkijonoon Näille kahdelle on tämän kurssin puitteissa vaikea keksiä hyödyllistä käyttöä
Isoja ja pieniä kirjaimia \u muuttaa seuraavan merkin isoksi kirjaimeksi \l muuttaa seuraavan merkin pieneksi kirjaimeksi perl pe 's/(.)(.)/\u$1\l$2/g;' Merkkijono voidaan muuttaa isoksi tai pieneksi laittamalle sen eteen \U tai \L ja loppuun \E perl pe 's/(^ )(...)($ )/$1\U$2\E$3/;' Edellinen osuu viisikirjaimisiin saneisiin (jos ne eivät ole peräkkäin).
Konkordanssiyritys Tämän kurssin tiedoilla emme opi tekemään kunnollista KWIC konkordanssia, mikään ei kuitenkaan estä yrittämästä Yritetään poimia haluttu sane ja ympäristöksi yksi sane sen molemmilta puolilta: perl pe 's/^(.* )?([^ ]+ sane [^ ]+).*$/$2/;' Ilman osumaa rivi jää entiselleen, blääh. Konkordanssia tarvitseva voi käyttää valmista skriptiäni: http://www.ling.helsinki.fi/kit/2003k/ctl160/skriptit/konko.perl
tr/// Perlissä voi muuttaa merkkejä toisiksi tr/// käskyn avulla: perl pe 'tr/a ZÅÄÖ/a zåäö/; Optiot d ja c tutut Unixin tr komennosta: perl pe 'tr/a z \n//dc;' Ei tarvita tällä kurssilla... Saman voi tehdä tehottomammin muodossa perl pe 's/[^a z \n]//g;' Egrep komennosta poiketen Perlissä voi viitata rivinvaihtomerkkiin
Lyhin mahdollinen osuma * ja + yrittävät osua mahdollisimman pitkiin merkkijonoihin Laittamalla Perlissä niiden perään kysymysmerkin, käytetään lyhintä sopivaa osumaa: $ echo "passi ja hammasharja" perl pe s/a.*a//g; p $ echo "passi ja hammasharja" perl pe s/a.*a//; p $ echo "passi ja hammasharja" perl pe s/a.*?a//g; p hsh $ echo "passi ja hammasharja" perl pe s/a.*?a//; p hammasharja
Luennolla lisäksi ehtimisen mukaan Pine tekstipohjainen sähköposti Twol morfologiset analysaattorit...