Perliiniin mä kaipaan niin eli Perl tutti # 2 Varoitus!!! Koska edellinen disclaimeri havaittiin palautteen mukaan vajavaiseksi, otan oikeuden tehdä lisäyksen siihen. Tämä teksti on jatko edellisen osan varoituksiin ja se koskee myös ensimmäistä dokumettia eli silleen. Elikkä siis tekijä ei vastaa mistään vallaunkumouksista tai vallankaappausyrityksistä, Tsetsenian pommituksista, Jugoslavian viisinkertaisesta bruttokansantuotteesta verrattuna Ambomaahan, Perlin vaikeudesta, DOS:n 8+3 merkin rajoituksesta eikä mistään muustakaan dokumentin tiedostonimeen viittavista ongelmista, Y2K ongelmista, Venäjän Y2K ongelmista, mahdollisista ydinvoimaloiden tuhoutumisista vuosituhannen vaihteessa, Venäjän Y2K ongelmista, USA:n Y2K ongelmista, muun maailman Y2K ongelmista, Venäjän Y2K ongelmista, Windowsin Y2K ongelmista, Bill Gatesin Y2K ongelmista, hiiren matkamittarin nollaantumisesta, bugimittarin ylikuormittumisesta, Venäjän Y2K ongelmista, elintarvikkeiden loppumisesta ennen vuodenvaihdetta, Y2K1 (Year 2001) ongelmista, ongelmista, ASCII teksturin puutteesta, skandien toimimattomuudesta, Venäjän Y2K1 ongelmista, pankkitilisi nollaantumisesta enkä varsinkaan Venäjän Y2K ongelmista!! Siis en ota mitään vastuuta mistään. End_of_Varoitus!!! Mitä hittoa sä häshäät? ----------------------- Elikkäs silppua (engl. hash) pitäisi tässä kohdassa silputa. Vaikka lupailin(?) ettei Perlissä olisi enempää muuttujien etulitteitä, puhuin potaskaa eli paskaa eli bullshittiä eli palturia. Tuleepi niitä ainakin yksi lisää, prosenttimerkki (%). Sitäkös käytetään tähän hashimiseen. Hash on melkeistä kun listat, mutta niitten indeksinumeroitten tilalla käytetään jotain muuta muttuujaa tai vakiota! Silpuketta tarvitaan harvoin kokonaisuutena, joten muuttujat %silppu on erittäin harvinaisia (ne kuolee sukupuuttooon!!!). Tällöstä meillä on jokin hieanompi tapa talleentaa/lukea hashista. Elikkäs esim erkki hätiin: $silppu{"a"}="bbb"; #elikkäs "a":ta vastaa arvo "bbb" $silppu{123.5}="543.2"; #"123.5":tä vastaa 543.2 Jottaskos käyttää pitäisi: print $silppu{"a"}; #rinttaa "bbb" $silppu{123.5}+=3; #tuleepi 546.2 Elikkäs easya. Ja tottakai noita hässimislistoja voidaan käsittellä myöäs: %hash=%silppu; #eipäs mitään onkkelmaa @lista=%silppu; #@lista on nyt ("a","bbb",123.5,543.2) %jehna=@lista; #%jehna=%hash=%silppu Elikkäs easy, juu kot it? Jottako hässimiseen on kyllä fynktiöitä omasta takaa, kuten: @lista=keys(%silppu); #ollakkos @lista nyt ("a",123.5) Se siis ottaa ne avainnumberit/merkit/mitänenytonkaan. Ja sitten olla myös values-funktio joka tekee saman kuin keys, mutta nille arvoille: @lista=values(%silppu); #@lista on ("bbb",546.2); Jottei(/a) onk(/hj)elmoijan elämä olisi helppoa, niin meillä on each fynktiö joka palauttaa sekä avaimen että arvon: while (($eka,$toka)=each(%silppu)) { print "$eka = $toka\n"; } Voidaanhan niitä poistellakin, joka tehokasta on, koska meillä delete-funktio on: delete $silppu{"a"}; #hässi %silppu sisältää vain yhren parin Ett sillee (vai onks se EN sillee vai kenties DE sillena?) Lukeminen ja writaaminen ------------------------ Elikkäs lukeminen (shit) happens näillä pienempi/suurempi kuin merkeillä. Meillä on muutama vakioinen lukuvirta. Ensinnäkin : $a=; #lukee näppikseltä, kunnes painetaan enterii #voipi olla myös jokin muukin inputti kuin näppis. @a=; #lukeepi aina rivin yhdeksi alkioiseksi. Kun painetaan #CTRL+Z niin lopettaapi. Sitten on myöäs pelkkä tyhjä sulkuyhdistelmä <>. Siis se ottaa lukee dataa niistä tiedostoista, jotka on määritetty komentorivillä. Elikkäs jos laitat siihen tiedoston nimen lukeepi se siitä tiedostosta sen inputtinsa. Elikkäs: perl esim.pl jee.txt jee2.txt. Jos muutes haluat tietää ne tiedoston nimet taikka muun paskan mitä siihen on kirjoitettu sen ohjelman perään, saat ne taulukosta @ARGV. Kirjoittaminen tiedostoon happens sit printillä taikka printf:llä. $a=print("Hello ", "World", "\n"); $a saa arvokseen joko 0 tai 1 eli false taikka true elikkäs onnistuko se writaaminen jonnekii. PSSSS! Tiedostosta lukeminen tuleepi myöhemmin. Säännönmukainen lause --------------------- Elikkäs heti esim erkkiä väliin. Tehdään siis find-komento, joka etsii tiedostosta merkkijonoa abc: while (<>) { if (/abc/) { print $_; #toi $_ meinaa edellistä lukutoimenpiteen #tulosta elikkäs tässä tapauksessa #tiedostosta luettua riviä. } } Siis kokeile: perl test.pl tiedosto.txt Nyt se etsii tiedostosta merkkijonoa abc (kirjoita tiedostoon esim. jeeabcde) ja rinttaapi jos joltakin rivitä sellainen löytyy. Ja tohon abc:n tilalle voitaisiin laittaa esim /[abcdeABCDE]/, jolloin etittäisiin kirjaimia a-e ja A-E. Muutama muu esim: [0123456789] #numeroita [0-9] #sama kuin äsken [0-9\-] #numerot sekä "-" merkki. [a-zäö0-9] #pienet kirjaimet, ääkköset sekä numerot. [a-zäöA-ZÄÖ0-9_] #kaikki kirjaimet, numerot sekä alaviiva. Sitten on myös ei-operaattori: [^0-9] #elikkäs kaikki muut paitsi numerot kelpaa. [^\^] #kaikki muut paitsi ^ merkki Sitten on myös valmiiksi määriteltyjä jutskia: Mikä Selitys ---- ------- \d numero eli [0-9] \w kaikki merkit, jotka sallittu Perlin muutujien nimissä \s tyhjä eli avaruus eli space tai vastaavat \D ei numero eli [^0-9] \W ei mikään Perlin muuttujien nimissä käytetyistä merkeistä \S Ei avaruutta (=no space) Täällä on myös kertoimia (*) joka meinaa että sen edellä olevaa merkkiä kerrotaa nollasta äärettömän määrä. Plussa (+) meinaa samaa kuin * mutta merkkejä on oltava vähintään yksi. Kysymysmerkki (?) meinaapi että etsitään nollasta yhteen sellaisia merkkejä. $_="Jouni xxxxxx Roivas"; #merkkijono s/x+/Joro/; #korvaapi yhden tai useamman x:n #merkkijonolla Elikkäs tulokseksi tulee "Jouni Joro Roivas". Onpi myöäs sellainen piste joka on suluissa (.) joka meinaa jokeria. Elikkäs $_="Jouni xy Roivas"; #merkkijono s/x(.)/Joro/ #jees $_="Jouni xyajsasd Roivas"; #merkkijono s/x(.*)/Joro/ #jees Aaltoiset sulut määräävät taasen minimi- sekä maksimimäärän ko. merkkejä. $_="Jouni xxxxxx Roivas"; #korvaapi s/x{5,10}/Joro/; #jos 5-10 x peräkkäin niin korvataan $_="Jouni xxx Roivas"; #ei korvaa s/x{5,10}/Joro/; Voidaan myös määrittää näin {5,} jolloin oltava vähintään 5 merkkiä, mutta maksimista ei puhuta ollenkaan. Sitten on myös vaihtoehtoisuus. Halutaan etsiä sinistä joko enkuksi tai suomen kiälen kauhialla mongerruksella. $_="Tämä on teksi, jossa esiintyy sininen sekä blue"; /sininen|blue/ Elikkäs | meinaapi että jos lausessa on jompikumpi kaikki on totta. Sitten tuota ehtintää voiraan rajottaa niiku eri tavoilla. Ensinnäkin on \b joka kertoo ettei sana saa olla pidempi kuin \b:llä merkattuun kohtaan. $_="Tämä on teksi, jossa esiintyy sininen sekä blues"; /blue/ #löytää blue:n sekä blues:n $_="Tämä on teksi, jossa esiintyy sininen sekä blues"; /blue\b/ #vain blue hyväksytään eli #blues hylätään. $_="Tämä on teksi, jossa esiintyy blue sekä darkblue"; /\bblue\b/ #Vain blue hyväskytään #ja darkblue hylätään. Sitten on myös vastainen toiminto eli \B elikkä rajaa ei saa olla: $_="Tämä on teksi, jossa esiintyy sininen sekä blues"; /blue\B/ #blue:ta ei hyväksytä mutta blues joo Sitten mennään eteenpäin: $a = "Hello world"; $a =~ /He/; #totuus $a =~ /(.)\1/; #myöäs totuus Kottako ei tunnista ISOJA ja pieniä kirjaimia elikkäs N!=n. Sorvataas Perl taipumaan siten että N==n. Sitkös vartenkos meillä on /i elikkäs ignore case. print "Kirjoita heippa: "; $a=; if ("HEIPPA" =~ /^$a/i) { #jossiis käyttäjä kirjoitti jotakin heippa-alkavaa #kuten heipparallaa tullaan tänne. Myöäs heippa kelpaa. } Notta vain heippa toimisi tehrään (tää on jo vanhaa asiaa): print "Kirjoita heippa: "; $a=; if ("HEIPPA" =~ /\b$a\b/i) { #jos siis käyttäjä kirjoitti heippa, tullaan tänne. } Aikaisemmissa eksampleissa jäi selittämättä miten se s/etsi/korvaa/ toimii. Tuossa määrittelyssä tulikin selitys eli kirjoita s/etsittävä_merkkijono_sekä_määrittelyt/korvaava merkkijono/ Splitti katkaisee merkkijonon palasiksi ja join yhdistelee niitä: $rivi= "Jee;tää;on;kivaa"; @lista=split(/;/,$rivi); #@lista on ("Jee","tää","on","kivaa") Elikkäs katkaistaan puolipilkun kohdalta ja listoiteaan. Joinaaminen olla sama jutska, muttas ettäs jottas: $merkkailujonoinen=join(";",@lista); Elikkäs nyhten $rivi=$merkkailujonoinen että et ett valitusta sitten jätä. Funktiot -------- Jotta uusi notta kappale! Historiallista!! Noniin. Niitä funktioita voi itsekin tehdä!!! Jee sukset, sanoi Jeesus, kun joululahjapakettinsa avasi. Elikkäs nämä funktiot on: sub nimi { #jotakin } Esimerkiki: sub sanojees { print "No sanon $jees\n"; } Elikkäs tulostetaan globaalin muuttujan $jees sisältö. Funktiot saa palauttamaan jonkin arvon myös. Se tapahtuupi returnilla. Elikkäs näin: sub laske { return $a + $b; } Elikkäs laskee $a:n ja $b:n summan. Nottako para-normaaleja-metrejä: sub heippa { print "Heippa $_[0]!\n"; } print "Annakkos nimesi: "; heippa(); Tulostelee: Heippa käyttäjän_nimi Kätevintä on kuiteskiin: sub heippa { print "Heippa @_\n"; } heippa("vaan ","sullekiin"); Elikkäs tähän voisi käyttää foreachia saamaan kaikki paramyllytykset selville: sub laske { $tulos=0; foreach $_ (@_) { $tulos += $_; } return $tulos; } print laske(1,2,3,4,5); #elikkäs tekee 15 Sitten voidaan käyttää jotain muitakin muuttujia kuin globaaleja: sub jehna { my $heippa; $heippa="hello"; return $heippa; } print jehna()."\n"; print "$heippa\n"; Elikkäs tulostaa "hello" ja ei mitään(!) koska heippaa ei oo määritelty siellä että silleeen joo. Ettäs loppu häämöttää. Tämä nimitäin on hauskaa kirjoitella joka päivä jotakin kivaa, jotenska tässä sulle jälleen yski tutti täyttämään kovoasi. Kohta tulee jotain kivaa.. Niinjoo se CGI-hommelit tulee vasta myöhemmin (ehkä vika tutti) mutta ensin pitää keksiä miten tota perliä käytetään yleensä. Sitten voidaan kehitellä niitä hianoja jutskia. Jotenkin tuntuu että saanet seuraavan tutin joskus kohtapuolin. HOHOI! Kohta tulee kauan odotettu Perl tutti kolmonen. (Siis tuskin edes tätä odotit). Ja sitten kun jos joku joskus saa kuulla että sulla on mun tekemä Perl tutti niin se valahtaa kateudesta siniseksi ja sitten I'm blue... Perl how they run! (C how they run) Kopiointioikeudet (c) 1+666+666+666 Joro, just another lamer in Perliini