460 likes | 623 Views
Perl on. Ohjelmointikieli, skriptikieli Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister Käytetään usein ”liimaamaan” järjestelmiä Larry Wall Perl on kieli, perl on binääri Unix hallinnointi ja CGI ohjelmointi. Perlin edut. Kehittämisen nopeus Voima
E N D
Perl on • Ohjelmointikieli, skriptikieli • Practical Extraction and Report Language • Pathologically Eclectic Rubbish Lister • Käytetään usein ”liimaamaan” järjestelmiä • Larry Wall • Perl on kieli, perl on binääri • Unix hallinnointi ja CGI ohjelmointi
Perlin edut • Kehittämisen nopeus • Voima • Käytettävyys • Siirrettävyys • Kehitys ympäristö • Hinta • Laajuus
Perus ohjelmointiympäristö • Notepad tms editori • Kirjoita koodia • Talleta C:\tiedostot hakemistoon • cmd komentokehoite • Suorita kehoitteella
Perl skripti • On nimeltään jotakin.pl • Alkaa aina näin: #!/usr/bin/perl • Sitten saa kirjoittaa koodia… esim: print ”Hei maailma!\n”; • Suoritetaan komentoriviltä: C:\hakemisto>perl jotakin.pl
Syntaksin tarkistaminen • Alussa kannattaa lukea varoitukset: C:\hakemisto>perl –w jotakin.pl • -w optio tarkistaa syntaksin ja varoittaa virheistä C:\hakemisto>perl –c jotakin.pl • Syntaksi tarkistin –c kertoo onko OK • Debuggeri käynnistetään näin C:\hakemisto>perl –d jotakin.pl
Parametrit • Skriptille voi antaa parametrejä välilyönnillä erottaen C:\hakemisto>perl jotakin.pl a b c • Ne talletetaan @ARGV taulukkoon print ”$ARGV[0] on eka parametri\n”;
Parametrit • Kaikkien parametrien tulostaminen foreach (@ARGV) { print ”$_ \n”; }
Ympäristö • Ympäristömuuttujat sijaitsevat %ENV taulukossa foreach (keys %ENV) { print ”$_ = $ENV{$_}\n”; }
User input • Skripti voi pysähtyä odottamaan käyttäjän syötettä • Syöte tulee standard input virrassa print ”Kirjoita jotain ja paina enter…”; $a = <STDIN>; print ”Kirjoitit: $a\n”;
Harjoitus 1 • Kiinalainen niukkuuspeli • Kirjoita ohjelma, joka pyytää käyttäjältä luvun ja vastaa aina voittavansa niukasti yhdellä. Näytä myös lopputulos.
PerlDoc • Perlin dokumentaatio sijaitsee täällä: file:///C:/Perl/html/index.html
Aliohjelma sub aliohjelma { Foreach (@_) { print ”$_ \n”; } }
Aliohjelmakutsu • Joko näin: aliohjelma (1,”aaa”,3); • Tai näin: $a = aliohjelma (1,2); • Alempi odottaa paluuarvoa
Paluuarvo • Aliohjelma voi palauttaa arvon $a = aliohjelma (1,2); print ”Vastaus on $a\n”; sub aliohjelma { my ($a,$b) = @_; $c = $a + $b; return $c; }
Skalaarit muuttujat • $muuttuja • Tyypitön yksiarvoinen muuttuja • Merkkijono, luku tai muistiosoitus • $a = 4; • $b = 111.22; • $c = ”merkkijono”; • $d = ”hassu $c”; #$c lavennetaan • $e = ’hassu $c’; #$c ei lavenneta • $f = `dir`;
Taulukko @ @taulukko = (); • Yksittäinen alkio $taulukko[0] • $taulukko[0] = 10; • $taulukko[1] = ”merkkijono”; foreach (@taulukko) { print $_, ”\n”; }
Lista @ • @lista = (10,”merkkijono”,10.12, $muuttuja); @lista1 = (); push(@lista1,1,2,3); @lista2 = (4,5,6,7,8,9); push (@lista1, @lista2); $viimeinen_indeksi = $#lista1; $alkioiden_lkm = @lista1; $vika = pop(@lista1);
Harjoitus 2 • Kirjoita ohjelma, joka pyytää käyttäjältä sanoja ja laittaa ne taulukkoon kunnes käyttäjä antaa sanan loppu. Tämän jälkeen ohjelma tulostaa sanojen määrän ja sanat. • Käytetään do … while silmukkaa • Puraistaan väärät merkit pois: chomp • Evaluoidaan totuus eq:n negaatiolla ne
Harjoitus 2 #!/usr/bin/perl do { print "Anna sana: "; $sana = <STDIN>; chomp($sana); push (@lista, $sana); }while ($sana ne "loppu"); $a = @lista; foreach (@lista) { print "$_ \n"; } print "Alkioita oli $a kpl\n";
Assosiatiivinen taulukko % %hash_taulukko = (); %config = ( ”polku” => ”/usr/bin/joku”; ”url” => ”http://www.palvelin.com/prefix”; ”debug” => $debug; );
Harjoitus 3a #!/usr/bin/perl %config = (); $debug = 1; %config = ( "polku" => '/usr/bin/joku', "url" => 'http://www.palvelin.com/prefix', "debug" => $debug ); print "Mikä polku, url vaiko debug? : "; $a = <STDIN>; chomp($a); print "\n $a on $config{$a}";
Assosiatiivinen taulukko % viittauksena $href; $href->{ 'key' } = 'value'; $href->{ $key } = $value;
Harjoitus 3 b #!/usr/bin/perl $config; $debug = 1; $config->{"polku"} = '/usr/bin/joku’; $config->{"url"} = 'http://www.palvelin.com/prefix'; $config->{"debug"} = $debug; print "Mikä polku, url vaiko debug? : "; $a = <STDIN>; chomp($a); print "\n $a on $config->{$a}";
Harjoitus 3c Lisää edelliseen sorttaus ja kaikkien parametrien tulostus for my $sender ( sort keys %from ) { print "$sender: $from{$sender}\n"; } Tai for my $sender ( sort keys %{$from} ) { print "$sender: $from->{$sender}\n"; }
Ehtolauseet • Testataan onko ehto voimassa vai ei eli evaluoidaan lausekkeen totuusarvo • Merkkijono on tosityhjä merkkijono tai ”0” on epätosi • Luku on tosi0 on epätosi • Olemassaoleva viittaus on tosi
if … else if (ehto) { } elsif (ehto) { } elsif (ehto) { } elsif (ehto) { } else{ }
if print ”Tosi on!” if ($a); unless $title = $header unless($title);
Harjoitus 4 • Tee perl ohjelma joka kysyy käyttäjältä kaksi lukua ja kertoo ovatko annetut luvut yhtäsuuret vai onko jompikumpi suurempi.
Silmukat • while • do … while • for • foreach • Pois silmukasta pääsee komennoilla next ja last
while while (ehto) { Toimintaa… }
do … while do { toimintaa… }while (ehto);
for for ($i=0; $i<=10; $i++) { Toimintaa… } for $i (0..10) { Toimintaa }
foreach foreach (@taulukko) { Toimintaa (muista $_) }
Harjoitus 5 • Tee perl ohjelma, joka pyytää käyttäjältä lukuja ja lopettaa kun haluttu summa on saavutettu. Jos käyttäjä syöttää muuta kuin numeron annetaan herja ja jatketaan.
Tiedostot • Tiedostoja luetaan KAHVAN kautta • Tiedosto avataan luku <, kirjoitus > tai täydennystilaan >> $tied = ”c:\\tiedostot\\lista.txt”; open (KAHVA, ”<$tied”); while (<KAHVA>){ print ”$_ \n”; } close KAHVA;
Tiedostot • Tiedostoon krjoittaminen print komennolla $tied = ”c:\\tiedostot\\teksti.txt”; open (KAHVA, ”>$tied”); print KAHVA ”normaali merkkijono…”; • Tämä siis ylikirjoittaa! open (KAHVA, ”>>$tied”); • Kirjoittaa tekstin perään
Random • Satunnaisluvun generointi $lower=1; $upper=14; $random = int(rand( $upper-$lower+1 ) ) + $lower; print $random,"\n";
Harjoitus 5 • Ventti • Pelaaja pyrkii saamaan 21 • Yli menee metsään eli häviää heti • Kirjoita ohjelma, joka tarjoaa ensin käyttäjälle kortteja (arvot1-14) ja kertoo aina summan • Kun käyttäjä ei enää halua kortteja, jaetaan piilossa emännän käsi. • Lopuksi kerrotaan tulos ja voittaja • Lisää vaikeusasteita: • Kirjoita jokaisen pelin tulos tiedostoon • Pyydä panos ja kirjaa häviöt ja voitot tiedostoon • Emännällä ventiksi riittää 20 • Ässä on 1 tai 14 tilanteesta riippuen • Viiden kortin ventti • Tulosta lopuksi kuitti voitoista/häviöistä kassalle…
Regular Expressions • Hakuja merkkijonoista • Korvataan merkkijonoja toisilla • Etsitään tiettyjä merkkejä • Tarkistetaan syötteiden oikeellisuus • Säännönmukainen lauseke kirjoitetaan / / merkkien sisälle • ASCII merkkejä ja erikoismerkkejä
Regular Expressions $a = ”abcabcaBcabc”; if ($a =~ /ab/){print ”löytyi\n”} if ($a =~ /Ab/i){… if ($a =~ /^b/){… if ($a =~ /c$/){… if ($a =~ /^abc$/){… if ($a =~ /…abc/){… if ($a =~ /[ab]|[AB]/){… if ($a =~ /^(a[b|B]*c)*/){…
Substitute • Korvataan merkkijono toisella $a =~ s/abc/cde/; $a =~ s/ä/a/g; $a =~ s/^\s+//; $a =~ s/\s+$//; $a =~ s/\s+/ /g;
Sähköpostin tarkistus if ($email =~ /^\w+@\w+(\.\w+){1,3}$/){… Jäsentäminen • Aikaleima muotoa 20061025161530000 $ts =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{3})$/; print ”Vuosi = $1, kuukausi = $2, päivä = $3 jne…”;
Split • Merkkijonon jakaminen merkin avulla $pvm = ”2006:10:25” ($v,$kk,$pv) = split /:/, $pvm; @sanat = split /\s/, $lause; ($avain,$arvo) = split /=/, $param; $$avain = $arvo;
Sisäänrakennetut funktiot • each(AARR) Palauttaa (seuraavan) indeksi-arvo-parin (2-alkioinen taulukko) annetusta assosiatiivisestä taulukosta. Komennon avulla voidaan siis käydä assosiatiivisen taulukon alkiot läpi. • exec(COM) Suorittaa annetun systeemikomennon, eikä koskaan palaa. • exists $t{$i} Palautta TOSI, jos indeksi $i löytyy taulusta %t. • exit(RET) Lopettaa suorituksen ja palaa arvolla RET. • grep(re, @t) Palauttaa taulukon (tai täsmänneiden lkm) sisältäen taulukon @t ne alkiot, joihin merkkijonolauseke re täsmäsi. • index(S,SS,P) Palauttaa ensimmäisen SS:n esiintymän paikan merkkijonossa S (tai paikan P jälkeen, jos käytössä, P on siis optio). • join(FS,LIST) Splitin vastakohta. Liittää listan tai taulukon erillisiä merkkijonoja (LIST) yhdeksi merkkijonoksi, jossa kenttäerottimena FS. • keys(AARR) Palauttaa taulukon, joka koostuu annetun assosiatiivisen taulukon indekseistä (nimistä). • length(S) Palauttaa merkkien lukumäärän annetussa merkkijonossa. Jos parametria ei anneta, $_:n pituus. • print FH LIST Tulostaa merkkijonon tai pilkulla erotellun listan merkkijonoja. FH on tiedostokahva,johon tulostetaan.
Sisäänrakennetut funktiot • printf FH LIST Kuten print, mutta mahdollisuus tulostaa formatoidusti, kuten C-kielessä. • rand UL Palauttaa satunnaisluvun väliltä 0-UL. • reverse LIST Palauttaa parametrina annetun listan (esim. merkkijono) käänteisessä järjestyksessä. • rindex(S,SS,P) Kuten index, mutta palauttaa viimeisen SS:n paikan merkkijonossa S. • sleep SEC Laittaa skriptin nukkumaan parametrina sekunteina annetuksi ajaksi. • sort LIST Palauttaa parametina annetun listan (esim. merkkijono) lajiteltuna. • split(FS,STR) Jakaa merkkijonon taulukkoon. FS (voi olla regexp) ilmaisee kenttäerottimen, jonka mukaan merkkijono STR jaetaan. • sprintf(FMT,LIST) Palauttaa FMT:n mukaan formatoidun merkkijonon listasta muuttujia (LIST). • srand Asettaa siemenluvun rand-operaattorille. • system(COM) Kuten exec, mutta ensin luodaan lapsiprosessi (fork). Jää odottamaan komennon paluuta. • values(AARR) Palauttaa taulukon, joka koostuu annetun assosiatiivisen taulukon arvoista (vrt. keys).