Perl

WEB-OHJELMOINNIN KOULUTUSTA VUONNA 2025!

Kurssit saatavilla kautta Suomen. Tule ja varaa oma koulutustapahtumasi heti! Koulutuksen järjestää asiantuntijasi Koulutus- ja konsultointipalvelu KK Mediat.

Johdatus Perliin

Perl on alun perin Unix-ympäristöön suunniteltu monikäyttöinen skriptikieli, jonka käyttöalue on laajentunut internetin myötä lähes kaikkiin alustoihin ja ympäristöihin. Erityisesti web-kehittäjiä kiinnostavia Perlin sovellusalueita on kaksi: Perlin käyttäminen CGI-ohjelminen kirjoitamisessa ja Perl palvelinpuolen skriptikielenä. Molemmissa käyttötarkoituksissa Perl on luotettava, ja usein myös parempi vaihtoehto kuin esimerkiksi PHP tai ASP.

Perlin suurta suosiota selostavat monet tekijät:

Yhdessä nämä tekijät ovat taanneet sen, että Perl on eräs netin käytetyimmistä (vaikkakin aliarvostetuimmista) ohjelmointikielistä, joka on oletusarvoisesti tuettu lähes kaikissa tarjolla olevilla hosting-ratkaisuissa.

Perlillä on erittäin omalaatuinen historia, jonka keskeisenä hahmona on Perlin kehittäjä, kielitieteilijä Larry Wall. Wallin vaikutus on näkynyt eritoten Perlin syntaksissa, joka on mielenkiintoinen sekoitus perinteistä kielioppia yhdistettynä ohjelmointimaailmasta tuttuihin menettelytapoihin. Perinteisiin skriptikieliin tottuneelle Perl voi vaikuttaa ensi alkuun erittäin sekavalta, jopa kryptiseltä, mutta pienen harjoittelun jälkeen kielen kauneus, yksinkertaisuus ja tehokkuus ovat ilmeisiä asioita.

Perl eroaa monista muista netissä käytettävistä skriptikielistä myös käyttötaustaltaan. Perl on alusta asti ollut vakavasti otettava ohjelmointikieli, kuten Java tai C. Tämän ansiosta Perl sisältää useita skriptikielistä normaalisti poikkeavia käsitteitä (keskeisimpinä syötevirta, tulostusvirta ja virheilmoitusvirta, tai STDIN,STDOUT,STDERR kuten niitä myös voidaan kutsua) ja toimintoja, jotka mahdollistavat huomattavasti laajempien ja monipuolisempien sovellusten laatimisen kuin puhtaalla www-käyttöön suunnatulla skriptikielellä. Käytännössä Perlin hyödyntämisen rajana on vain mielikuvitus.

Perl-tulkin asennus Windows-alustalle

Tässä oppaassa Perl-toimintaympäristönä on Perlin yleisin jakeluversio ActiveState:n ActivePerl-pakettia. Jakelupaketti sisältää Perlin perustoiminnallisuuden lisäksi kattavan dokumentaation sekä PPM-ratkaisun, jonka Perl-toimintaympäristöä voidaan laajentaa uusilla kirjastoilla. Windows-käyttäjälle erittäin arvokas lisuke on Perl ISAPI, jonka avulla Perl voidaan liittää mihin tahansa ISAPI-standardia tukevaan web-palvelimeen (esim. Microsoft IIS).

Vaihe 1. Lataa ActivePerlin sivustolta Perlin MSI-asennuspaketti (noin 8.6MB)

Vaihe 2. Aloita Apachen asennusprosessi kaksoisklikkaamalla asennusohjelman (MSI) kuvaketta

Vaihe 3. Asennusohjelma käynnistyy. Valitse optio Next.

Perlin asennus

Vaihe 4. Tutustu ActivePerl-jakelupaketin lisenssiehtoihin. Mikäli hyväksyt ehdot, valitse optio "I accept" ja paina Next-painiketta.

Perlin asennus

Vaihe 5.Valitse asennuksen laajuus. Perl etenee automaattisesti mukautettuun asennukseen, jossa voit valita mitkä osa-alueet haluat asentaa. Oletuksena on täysasennus, mikä on useimmissa tapauksissa erittäin hyödyllinen. Suositeltava asennuspolku on C:/Perl

Perlin asennus

Vaihe 6. ActivePerlin uusissa versioissa on mukana niin kutsuttu Perl PPM, jonka avulla kehittäjät voivat entistä helpommin laajentaa ja ylläpitää tietoa ydin-Perlin ohelle ladattavista kirjastoista. Mikäli haluat asentaa PPM:n, laita ruksi kohtaan enable:

Perlin asennus

Vaihe 7. Oletusarvoisesti asennusohjelma luo tarvittavat ympäristömuuttujat käyttöjärjestelmään, sekä luo yhteyden perl-tiedostopäätteen .pl ja Perl-tulkin välille. Koska koneelle johon Perl-tulkkia asennetaan löytyy myös Microsoftin IIS-palvelin, tarjoutuu asennusohjelma luomaan tarvittavat yhteydet Perlin käyttämiseksi www-julkaisuissa jotka ovat IIS:n alla. :

Perlin asennus

Vaihe 8. Asennusohjelma valmistautuu suorittamaan asennuksen valituilla optioilla. Perlin täysasennus voi kestää jopa 10-15 minuuttia.

Perlin asennus

Vaihe 9. Kun asennus on suoritettu,esitetään julkaisuversioon liittyvät tiedotteet.

Perlin asennus

On suositeltavaa, että ruksaat alalaidassa olevan option, jolloin sinut automaattisesti ohjataan ActivePerlin käyttöohjeeseen. Asennusohjelma on luonut käynnistysvalikkoon valmiit pikalinkit dokumentaatioon, joten sinun ei erikseen tarvitse merkitä tätä sivua suosikkeihin.

Perlin asennus

Perlin asentaminen IIS:n päälle:

Perlin asentaminen IIS:n päällä onnistuu helpoiten ruksaamalla asennusohjelman yhteydessä optio "create IIS mappings". Mikäli tämä optio ei kuitenkaan toimi tai haluat luoda tarvittavat kytkökset manuaalisesti IIS:n hallintapaneelin kautta, tapahtuu se seuraavasti:

  1. Avaa IIS:n hallintakonsoli (Start > Run > iis.mmc)
  2. Valitse oletusarvoisen Web-sivuston ominaisuudet.
  3. Välilehdeltä Kotikansio valitse painike kokoonpano.
  4. Sen ensimmäisellä välilehdellä (Yhdistämismääräykset), valitse painike Lisää.
  5. Anna avautuvaan dialogi-ikkunaan seuraavat tiedot:
    Komento: C:\Perl\bin\perl.exe "%s" %s
    Tunniste: .pl
    Verbit/Rajoitukset: GET,HEAD,POST
  6. Klikkaa ok.

Luonnollisesti kansio johon asetat perl-skriptit vaatii itselleen suoritusoikeudet.

Perlin asentaminen Apachen päälle

Perlin perusasennus Apachen päälle on hyvin yksinkertainen. Lisää konfiguraatiotiedostoon httpd.conf direktiivi:

AddHandler cgi-script .pl 

Yo. komento edellyttää tietenkin, että Perl-skriptit suoritetaan CGI-bin oikeuksin määritetyssä sijainnissa. Mikäli Perlin suorituskykyä halutaan virittää huomattavasti normaalia nopeammaksi, on Apachen mod_perl-moduuliin tutustuminen enemmän kuin suositeltavaa.

Yleisesti Perlin syntaksista

Perlin lauserakenteet ja syntaksi muistuttavat läheisesti C, PHP tai JavaScript- kielten rakenteita, mutta lähempi tarkastelu paljastaa selviä eroavuuksia kielten välillä. Eräs Perlin vahvuuksista on, että se tarjoaa lukuisia tapoja ja tyylejä kirjoittaa ohjelmia ja ilmaista toimintoja. Sama piirre tarjoaa myös Perlin ikävimmän piirteen: Perl-gurujen kirjoittama koodi voi olla lukukelvotonta kaikille muille paitsi heille itselleen.

Komentotulkin sijainti

Kenties omalaatuisin piirre muihin skriptikieliin verrattuna on komentotulkin määrittely koodissa. Jos olet joskus tutkaillut CGI- tai Perl-tiedoston koodia, olet varmaan huomannut tiedoston ensimmäisellä rivillä kryptisen merkinnän:

#!/usr/bin/perl

Kyseessä on Perlin erikoiskomento, joka määrittelee Perl-tulkin sijainnin. Yllä oleva esimerkki on *NIX-ympäristöstä. Windows-ympäristössä Perl-tulkin sijainti merkittäisiin seuraavasti:

#!c:/perl/bin/perl

POSIX-ympäristössä saat Perl-tulkin sijainnin selville suorittamalla komennon "whereis perl" shellissä.

Komentotulkin sijaintiin liittyy vielä yksi tärkeä asia, joka on nk. Strict-määrittelyn käyttäminen. Oletusarvoisesti Perl tulkitsee ja suorittaa tiedoston virheistä välittämättä ja niistä kertomatta. Jos haluamma informaatiota mahdollisista virheistä jne, tulisi erityisesti kehitystyöskentelyn aikana / debuggausvaiheessa käyttää nk. strict-määrittelyä yhdistettynä komentotulkin warning-optioon:

#! c:/perl/bin/perl -w
use strict;

Lauseet ja lausekkeet

Lause on koodin pienin yksikkö ja viittaa suoritettavaan kokonaisuuteen. Toisin kuin esimerkiksi JavaScriptissä, Perlin lauseet ovat itse asiassa lausekkeita, jotka palauttavat jonkin arvon. Esimerkiksi sijoituslauseen arvo on sama kuin sijoitettu arvo. Lauseke voi olla muuttuja, operaattori tai funktiokutsu, jolla on jokin arvo.

Kun lauseke esiintyy lauseen asemassa, sen palauttamaa arvoa ei käytetä. Lohkon viimeisen lauseen palauttamasta arvosta tulee koko lohkon palauttama arvo. Lause päätetään puolipisteeseen:

lause;

Jos lause on lohkon viimeinen, puolipisteen voi jättää pois ilman että se aiheuttaisi virhettä. Hyvä käytäntö on kuitenkin aina noudattaa yhtenäistä koodausmenetelmää ja lisätä puolipiste aina lauseen loppuun.

Esimerkiksi:

my ($i,$j) = (0,0);
$i = $j = 3; 

Lohkot

Eräs C:n kaltaisille kielille yhtenäinen piirre ovat lohkot. Lohkojen avulla ohjelmoija voi kapseloida koodiaan pienemmiksi yksiköiksi, joilla on rajattu vaikutusalue. Perlissä lohkoja ovat:

Kommentit

Kommentti merkitään *NIX-maailmassa normaaliin tapaan nk. risuaitasyntaksilla:

# Tämä on kommentti

Muuttujat ja niiden esitteleminen

Samoin kuin useimmat muutkin skriptikielet, myöskään Perl ei välttämättä edellytä muuttujien esittelemistä. Nk. Perl Style Guide kuitenkin suosittelee Use Strict- määrittelyn käyttämistä Perl-ohjelmissa, jolloin muuttujat on aina esiteltävä ennen niiden käyttämistä. Strictmode-tilan ansiosta Perl antaa esittelemättä jätetyistä muuttujista virheilmoituksen, ja helpottaa täten mm. mahdollisten kirjoitusvirheiden löytämistä.

Eräs tapa muuttujien esittelemiseen on käyttää my()-funktiota, jolloin muuttujat ovat käytettävissä esittelyn sisältävän lohkon ja kaikkien sen sisältämien lohkojen sisällä (ts. muuttujat ovat paikallisia). Toinen vaihtoehto paikallisten muuttujien toteuttamiseksi on funktio local().

Katsotaan ensiksi tilannetta, jossa aiheutamme tahallisen virheen yrittämällä tulostaa olematonta muuttujaa. Koska emme ole käyttäneet Use Strict-määrittelyä emme saa siitä minkäänlaista ilmoitusta:


#! c:/perl/bin/perl 
$i = 0;
print "$ii\n";   # Virheilmoitusta ei tulosteta

Sen sijaan lisäämällä määrittelyn use strict, kääntäjä kertoo meille määrittelemättömästä muuttujasta:


#! c:/perl/bin/perl -w
use strict;
my $i;
$i = 0;
print "$ii\n";   
# Virheilmoitus tulostetaan

Mikäli haluamme määritellä kerralla useita muuttujia, tapahtuu se seuraavasti:


# sijoitetaan muuttujien nimet pilkulla erotettuun listaan
my ($k,$m);  
# tai jos haluamme antaa niille alkuarvot
my ($p,$q) = (1,2); 

Koska kaikki my - ja local funktioiden avulla määritellyt muuttujat ovat paikallisia, on niiden vaikutusalue rajattu määrittelyn sisältävään lohkoon. Kyseessä on olennaisen tärkeä seikka, koska se mahdollistaa useiden samannimisten muuttujien olemassaolon samassa tiedostossa. Sisemmässä lohkossa esitelty samanniminen muuttuja "peittää" aina ulommassa lohkossa esitellyn muuttujan näkyvistä. Siispä:


my $i;
$i = 0;

if ($i < 0) {
	# $j on nyt tämän lohkon muuttuja.
	#$i näkyy ulommasta lohkosta sisälle päin.
my $j = $i; 
} else {
my $j = 1;  
# $j on tämän lohkon sisäinen muuttuja.
print "$j\n";   
# tulostamme luvun 1
}

# Muuttuja $i tulostuu normaalisti
print "$i\n";  

# Virhe! Muuttuja $j ei ole käytettävissä.
print "$j\n";  

Johdatus Perlin tietotyyppeihin

Perl on nk. tyypitön / tyyppivapaa ohjelmointikieli. Perlissä ei tehdä siis eroa merkkijonojen, eri muotoisten lukujen tai totuusarvojen (boolean) välillä. Perlissä muuttujat ja arvot kuitenkin luokitellaan niiden rakenteen mukaan. Muuttujat ja niiden arvot voivat olla skalaareja, taulukoita, assosiatiivitaulukoita (hashtable) tai funktioita.

Muuttujien nimet alkavat niiden rakennetta kuvaavalla merkillä:

Samaa nimeä voidaan käyttää eri rakenteisista muuttujista. Esimerkiksi nimet $x ja @x tarkoittavat kahta eri muuttujaa.

Skalaarit (scalars)

Skalaarilla tarkoitetaan rakenteellisesti yksittäisestä tiedosta muodostuvaa arvoa. Tällaisia ovat:

Skalaarimuuttujan nimi alkaa $-merkillä. Esimerkiksi:

$merkkijono="Jotain tekstiä";

Taulukot (arrays)

Perlissä taulukoilla ei ole kiinteää kokoa, vaan se voi vaihdella ohjelman suorituksen aikana. Taulukoita indeksoidaan nollasta alkaen. Mihin tahansa taulukon alkioon voidaan sijoittaa arvo. Jos käytetty indeksi on suurempi kuin suurin siihen mennessä käytetty, taulukko laajenee automaattisesti.

Taulukkomuuttujan nimi alkaa @-merkillä. Esimerkiksi:

my @viikonpaiva;

Assosiatiivitaulukkot (hashtables)

Assosiatiivitaulukot (hash) ovat taulukoita, joita indeksoidaan kokonaislukujen sijasta merkkijonoilla. Kyseessä on siis avain-arvo-muotoinen taulukkomuuttuja.

Assosiatiivitaulukkomuuttujien merkki on %. Esimerkiksi:

my %viikonpaivat 

Funktiot

Perlissä myös funktio voi olla muuttujan arvona. Funktioarvon tunnus on &. Tätä merkkiä voidaan kayttää myös funktiota kutsuttaessa, vaikka se ei yleensä olekaan välttämätöntä. Joskus asiayhteydestä ei voida päätellä, tarkoitetaanko tietyllä merkinnällä funktiota vai ei. Tällöin &-merkin käyttäminen funktion nimen edessä auttaa.

Skalaarit

Skalaarilla tarkoitetaan rakenteellisesti yksittäisestä tiedosta muodostuvaa arvoa. Tällaisia ovat:

Skalaarimuuttujan nimi alkaa $-merkillä.

Merkkijonoliteraalit

Merkkijonoliteraaleja voidaan kirjoittaa kolmella tavalla:

Ensimmäinen tapa on merkitä arvo heittomerkkien (') väliin. Tällöin merkkijonoarvo muodostuu heittomerkkien väliin kirjoitetuista merkeistä sellaisenaan, poikkeuksena heittomerkki ja kenoviiva, joiden eteen on kirjoitettava kenoviiva. Esimerkiksi:


print 'abc 456 $x \\ \' \n'   #tulostaa abc $x \ ' \n 
my $s = 'sisältö';
print 'Tässä merkkijonossa muuttujaa ei huomioida (esim. $s)\n';
print 'Ei myöskään rivinvaihtomerkkiä (\n).';

Toinen tapa on merkitä arvo lainausmerkkien (") väliin. Tämä menee muuten saman kuin edellinen, mutta muuttujien nimet korvataan niiden arvoilla ja ohjausmerkkejä tarkoittavat merkinnät kuten \n korvataan niiden tarkoittamilla merkeillä. Jos muuttujan nimi halutaan lainausmerkein kirjoitettuun merkkijonoon, sen eteen on kirjoitettava kenoviiva


my $s = 'b';
print "a, $s ja c\n ovat aakkosten kolme ensimmäistä kirjainta\n";
# tulostaa: 
#a, b ja c 
#ovat aakkosten kolme ensimmäistä kirjainta 
#mutta tämä tulostaakin jotain muuta
print "a, \$s ja c\n ovat aakkosten kolme ensimmäistä kirjainta\n";

Kolmas merkintatapa on merkitä arvo <<lopetusrivi-merkinnän avulla merkkijonoarvo muodostuu tätä ohjelmariviä seuraavien rivien sisällöistä seuraavaan lopetusrivisisältöiseen riviin asti. Jos samalla rivillä on useita <<-merkintöjä, niitä vastaavat arvot kirjoitetaan seuraaville riveille peräkkäin. Tässä merkinnässä muuttujien arvot ja ohjausmerkkien nimet korvataan. Esimerkiksi:


my $stringi = <<XXX;
Käytettäessä '<<'-literaalia, merkkijono voi muodostua
useista peräkkäin kirjoitetuista riveistä.
XXX

print "$stringi\n";

Lopetusrivi-merkintä on erittäin hyödyllinen, jos joudumme sijoittamaan pitkiä merkkijonoja useisiin muuttujiin:


my ($u,$v) = (<<XXX,<<XXX);
Näin voi määritellä myös useita merkkijonoarvoja samalla kertaa.
XXX
Tämä arvo vastaa jälkimmäistä '<<'-merkintää.
XXX

print "$u$v\n";

Lukuliteraalit

Samoin kuin monissa muissakin skriptikielissä, Perl osaa tehdä tarvittavat tyyppimuunnokset lukuliteraalien välillä automaattisesti. Tämän ansiosta voit siis laskea liukulukuja ja kokonaislukuja keskenään.

Kokonaislukuja voidaan kirjoittaa:

Liukulukuja voidaan kirjoittaa:

Esimerkiksi


#!c:/perl/bin/perl
use strict;

# kokonaislukuja
my $i1 = 123;
my $i3 = -345;
# Oktaalilukuja
my $o1 = 023;    # muuttujan arvo on 2*8^1 + 3*8^0 = 16 + 3 = 19
# Heksadesimaaliluku
my $h1 = 0x23;   # muuttujan arvo on 2*16^1 + 3*16^0 = 32 + 3 = 35
#:Liukulukuja
my $f1 = 12.3;
my $f3 = -.345;
# Eksponenttimuotoisia lukuja
my $e1 = 2e3;      # muuttujan arvo on 2*10^3 = 2000 
exit 0;

Osoittimet

Yksinkertaista taulukkoa ja assosiatiivitaulukkoa monimutkaisemmat rakenteet (ml. moniulotteiset taulukot) rakennetaan Perlissä osoittimien (reference) avulla. Osoittimien käytöstä kerrotaan taulukoiden, assosiatiivitaulukoiden ja funktioiden käsittelyn yhteydessä.