PERL TIE-20306 Principles of Programming Languages Ryhmä 4: Joonas Lång & Jasmin Laitamäki
1. Johdanto Perl on ohjelmointikielten perhe, johon kuuluu Perl 5 ja Perl 6. Kielet ovat kuitenkin erilliset ohjelmointikielet omine kehitysryhmineen. Perl 6 on kehitetty Perl 5 jälkeen, mutta sillä ei ole ollut merkittävää vaikutusta Perl 5:n kehitykseen (1). Tästä lähtien Perl tarkoittaa Perl 5:sta. Perl on tulkattava ohjelmointikieli, jonka on kehittänyt Larry Wall (2). Alun perin Perl kehitettiin erityisesti tekstin manipulointia varten. Se optimoitiin skannaamaan mielivaltaisia tekstitiedostoja, keräämään informaatiota niistä sekä tulostamaan raportteja tämän tiedon pohjalta. Perlistä tuli nopeasti hyvä kieli järjestelmien hallintaan. Vuosien mittaan Perl on kielenä kasvanut hyvin monikäyttöiseksi. Kieltä käytetään nykyään niin yksirivisten, kuin täysimittaistenkin ohjelmien kehittämiseen. (3) Perl on ohjelmointikielenä enemmän käytännöllinen ja tehokas, kuin kaunis (4). Perlin tärkeimpiä ominaisuuksia ovat sen helppokäyttöisyys, ja tuki sekä proseduraaliseen, funktionaaliseen että olio-suuntautuneeseen ohjelmointiin. Lisäksi sillä on vahva sisäänrakennettu tuki tekstin käsittelyyn. (3) 2. Historia Vuonna 1987 Larry Wall alkoi kehittää Perl-ohjelmointikieltä, ja jo saman vuoden joulukuussa julkaistiin kielen ensimmäinen versio 1.0. Kielestä julkaistiin muutaman seuraavan vuoden aikana myös versiot 2 ja 3. Perlin suosio kasvoi nopeasti tämän muutaman vuoden aikana. Aluksi Perlin ainoa dokumentaatio oli yksi manuaalisivu. Vuonna 1991 julkaistiin kuitenkin kirja nimeltä Programming Perl. Samalla versionumero kasvoi neloseen. Vuonna 1994 julkaistu Perl 5 sisälsi paljon uusia ominaisuuksia, mm. lähes täysin uudelleen kirjoitettu tulkki, viittaukset, oliot ja moduulit. Perl 6:n kehitys alkoi vuonna 2000. Suunnittelussa lähdettiin Perl 5:sta liikkeelle, mutta käytännössä koko kieli ja tulkki kirjoitettiin uudelleen. (2) 3. Ominaisuudet 3.1. Muuttujien tyypit ja niiden näkyvyys Perl sisältää kolme erilaista sisäänrakennettua tietotyyppiä: skalaarit(scalars), taulukot(arrays) ja hajautustaulut(hashes). Muuttujan nimen edessä oleva merkki kuvaa muuttujan sisältämää tietotyyppiä. Jos ohjelman alussa on rivi use strict;, täytyy ohjelmoijan kirjoittaa muuttujan nimen eteen sana my. Jos ohjelman alussa ei ole kyseistä riviä, eikä ohjelmoija käytä sanaa my muuttujan nimen edessä, tulee muuttujasta globaalimuuttuja. skalaari Skalaari esittää yksittäistä arvoa, joka voi olla tekstiä, kokonaisluku tai liukuluku. Muuttujan nimen eteen kirjoitetaan tällöin $-merkki. Myös alkioiden, jotka saadaan taulukosta tai hajautustaulusta,
eteen kirjoitetaan $-merkki. Ohjelmoijan ei tarvitse itse kertoa minkä tyylistä dataa skalaari-muuttuja sisältää. Esimerkki skalaari-muuttujista: my $animal = camel ; my $answer = 42; taulukko Taulukko sisältää listan arvoja, skalaareja. Perl-kielessä taulukon indeksointi alkaa nollasta. Taulukkomuuttujaa luodessa muuttujan nimen eteen kirjoitetaan @-merkki. Ohjelmoijan ei tarvitse tarkemmin kertoa mitä dataa taulukko sisältää. Esimerkki taulukko-muuttujista: my @animals = ( camel, dog, cat ); my @numbers = (23, 42, 69); my @mixed = ( camel, 42, 1.23); hajautustaulu Hajautustaulu sisältää joukon avain-arvo -pareja. Hajautustaulu-muuttujan nimen eteen kirjoitetaan %- merkki. (4) Esimerkki hajautustaulu-muuttujasta: my %fruit_color = ( apple, red, banana, yellow ); tai vaihtoehtoisesti my %fruit_color = ( apple => red, banana => yellow, ); Alustamattoman muuttujan numeerinen arvo on 0 ja merkkijono. Totuusarvoille ei ole olemassa omaa muuttujatyyppiä ja ehdoissa epätotuus päätellään sen mukaan, onko muuttuja alustamaton, 0, 0, tai tyhjä taulukko. Muut arvot luetaan todeksi. 3.2. Tyypitys ja muistin hallinta Perlissä on dynaaminen tyypitys. Kieli hoitaa automaattisesti datan tyypityksen sekä muistin hallinnan. Tulkki tietää objektin tarvitseman muistin määrän sekä sen tyypin, näin se varaa ja vapauttaa muistia tarvittaessa. Tyyppimuunnokset, jotka ovat laillisia tehdään suorituksen aikana automaattisesti, kun taas laittomat aiheuttavat käännösvirheen. Perlissä ei voi aiheuttaa muistivuotoa, sekoittaa sisäisen datan esitystä tai kaataa tulkkia. (2)
3.3. Säännölliset lausekkeet Muuttujien tarkkailuun ja tiettyjen arvojen etsimiseen niistä, Perl tarjoaa monimuotoisia ehtoja, joita yhdistelemällä on mahdollista toteuttaa monimutkaisempiakin hakuja. Näitä kutsutaan säännöllisiksi lausekkeiksi (regular expressions tai regexes ). Perinteisesti tämä voidaan toteuttaa vertailemalla muuttujaa =~ -merkillä ja kirjoittamalla sen oikealle puolelle kahden /-merkin väliin tarkkailuehdot. Esimerkiksi kirjoittamalla sana Essee ehdoksi, kääntyy tämä todeksi, jos tarkkailtava muuttuja pitää sisällään tämän tarkkailtavan sanan. Näitä ilmauksia voi yhdistää ehto- tai silmukkalauseisiin määrittämään suoritetaanko lause. "Tekstiä jossa on sana Essee mukana" =~ /Essee/; #Tosi Kauttaviivojen sisään voi lisätä monia eri merkkejä tarkentamaan ehtoa. Esimerkiksi kirjoittamalla \d kauttaviivojen väliin toteuttaa tosi arvon, jos vertailtava kohde on yksi numero arvo väliltä 0-9. "2016" =~ /\d\d\d\d/; #Tosi Jos etsitään tiettyä sanaa tekstin alusta, laitetaan ^-merkki ensimmäisen kauttaviivan jälkeen. "Tekstiä jossa on sana Essee mukana" =~ /^jossa/; #Epätosi Jos taas sanaa haetaan tekstin lopusta, käytetään $-merkkiä ennen viimeistä kauttaviivaa. "Tekstiä jossa on sana Essee mukana" =~ /mukana$/; #Tosi Ehtoja yhdistämällä voidaan toteuttaa monimutkaisempia lauseita esimerkiksi: "numero 556" =~ /[a-z]+\s+\d*/; #Tosi Lause kääntyy todeksi, jos tarkkailtava muuttuja koostuu pienellä kirjoitetusta sanasta, sanan jälkeen on vähintään yksi välilyönti, ja sitten mikä tahansa määrä numeroita. (7) 3.4. Muita ominaisuuksia Perl ohjelmien käskyt lopetetaan puolipilkkuun ja niiden sisältöä on mahdollista levittää monelle riville kuten C++:ssa. Poikkeuksena on kuitenkin tekstimuuttujat, joihin tallentuu myös rivinvaihto. Perl tarjoaa myös vapautta syntaksissaan antamalla ohjelmoijalle mahdollisuuden olla laiska ja jättää esimerkiksi sulkuja pois funktiokutsuista. Koodin kommentointi onnistuu #-merkillä. Virheiden käsittelyä varten Perl tarjoaa kätevän "or die"-käskyn, joka lisätään tarkkailtavan komennon jälkeen virhe tekstin kera. Jos tarkkailtava operaatio epäonnistuu, virhe teksti tulostetaan. Print "Tulostus onnistui" or die "Tulostus epäonnistui"; Ehto- ja silmukkalauseita on mahdollista toteuttaa kuten C++:ssa. if($arvo!= 0){ } Print "Ehto totta"; Perl tarjoaa myös mahdollisuuden kirjoittaa lauseita toisinpäin. Toteutettava käsky esitetään ensin, ja itse tarkasteltava ehto vasta sen jälkeen. (4) Print "Ehto totta" if $arvo!= 0; #molemmat toimivat
4. Suosio Perl on ollut myös suosittu web-ohjelmoijien työkalu 1990-luvun lopulta alkaen, ja siihen onkin kehitetty tätä tukevia kirjastoja (2). Kielen hyvät prosessi-, tiedosto- ja tekstin manipulointi ominaisuudet tekevät siitä suositun tehtävissä, joihin kuuluu esimerkiksi nopeaa prototyypitystä, järjestelmien hallintaa, ohjelmistotyökaluja, tietokantojen käyttöä, graafista ohjelmointia, verkkotyöskentelyä tai web-ohjelmointia (5). 5. Heikkoudet Koska ohjelmointitapoja on kielessä useita, ei kieli pakota ohjelmoijaa siistiin koodiin. Perl tarjoaa monia eri tapoja toteuttaa asioita ja tämän seurauksena toisen ohjelmoijan luomaa koodia voi olla vaikea tulkita, ja metsästää mahdollisia virheitä. (2) Lähdeluettelo 1. About Perl. [Online] https://www.perl.org/about.html. 2. Perl. [Online] https://fi.wikipedia.org/wiki/perl. 3. Wall, Larry. Perl Programming Documentation. [Online] http://perldoc.perl.org/perl.html. 4. Robert, Kirrily. Perl Programming Documentation. [Online] http://perldoc.perl.org/perlintro.html. 5. Christiansen, Tom and Torkington, Nathan. Perl Programming Documentation. [Online] 2010. http://perldoc.perl.org/perlfaq1.html. 6. Perl. [Online] https://en.wikipedia.org/wiki/perl. 7. Kvale, Mark. Perl Programming Documentation. [Online] http://perldoc.perl.org/perlrequick.html