KursoversiktKurset er beregnet for de som er kjent med grunnleggende programmering inkludert funksjoner, bibliotek og elementære objekt-orienteringsmetoder. Vi vil se på språkets sterke og svake sider, de viktigste grunnelementene samt mer avanserte ting som komplekse datastrukturer og objekt-orientert programmering. Vi skal også lage enkle og mer avanserte perl-script, bruke moduler og dokumentere på en enkel måte. Perl under Microsoft-plattformer blir gledelig ignorert - UNIX er tingen! :^) |
Del 1: Hva er Perl? | ||
|---|---|---|
|
Litenperl -e 'print "Hello, World!\n";'
Åpen"Practical Extraction and Report Language" er et fjerdegenerasjons språk som er laget for "å få jobben gjort." Språket er over ti år gammelt, og uvikles som et OSS-prosjekt av Larry Wall i samarbeid med flere hundre mennesker fra hele verden. Perl og de aller fleste modulene er lisensiert under "GNU Public License" eller "Artistic License" - du velger selv.
KraftigPerl har flere GUI-moduler, støtter alle lavnivå internettprotokollene, har uhyre kraftige tekstbehandlings-muligheter, tillater både funksjonell og OO-programmering, har meget gode database-API, og tillater det meste noen skulle trenge å programmere i løpet av en dag.
'Naturlig'Perl er fra begynnelsen av blitt utviklet som et "naturlig" språk - det vil si at det er så dynamisk at du kan gjøre nyttige ting selv om du bare kan noen få ord, eller at du kan bruke år på å mestre hele språket. Det er lett å lære seg nye elementer i språket, og det finnes altids en nåte å uttrykke seg på som passer din programmeringsstil.
Til fare for liv og helse!Dessverre er det for lett å programmere dårlig eller farlig i perl - slikt kommer ofte med på kjøpet når man velger å bruke et kraftig verktøy. Perl gir nok muligheter til at du ikke bare kan skyte deg selv i foten, men faktisk gjøre det med stil, ekstravaganse og utrolig letthet! Heldigvis har språket et par hjelpemidler så du unngår de groveste dumhetene. Det gir derimot ikke grunn til å la være å passe på!
Litt størreOm du vil, kan du også bryne deg på litt "vanskeligere" ting. (Denne er egentlig ikke så vanskelig! Etter kurset bør du kunne finne ut hva som skjer.)
| ||
Del 2: Pathologically Eclectic Rubbish Lister | |
|---|---|
|
Hva egner perl seg til?
Hva egner det seg ikke til?
Men tenk over oppgaven!Det er mulig perl ikke er den beste løsningen til akkurat din oppgave! Det finnes mange språk, og vårt egner seg ikke til alt (selv om det kan brukes til svært mye.) Om et skriptspråk er løsningen, ta gjerne også en titt på Python, TCL, Scheme eller til og med Visual Basic - alle disse har egne fordeler og ulemper. Noen ganger trenger du ytelsen fra lavnivåspråk, og da er det meget mulig at Perl er feil løsning.... Kanskje det smarteste er å lage en perl-modul i C? :^) | |
Del 3: Latskap, Utålmodighet og Hovmod! | |
|---|---|
|
Perl-programmererens tre dyder
| |
Del 4: Fordeler og Ulemper | |
|---|---|
|
Plusspoeng
Minuspoeng
| |
Del 5: Datastrukturer i Perl | |
|---|---|
|
I perl opererer man i hovedsak med tre typer data (det finnes flere, men de er ikke så viktige i starten.)
| |
Del 6: Scalars (skalare verdier?) | ||||
|---|---|---|---|---|
|
Skalare verdier angis ved å bruke en '$' foran
variabelnavnet.
I mange programmeringsspråk (f.eks. C eller Pascal) deklarerer man typen på variabelen (f.eks. "char* hilsen;") før den brukes, noe som ikke er nødvendig i perl - et tall er en skalar, og ikke en integer, float, double eller slikt. Bare husk å forhåndsdeklarere variablene (selv om du ikke må.) Dette kan gjøres ved å bruke my()
foran variabelen, eller ved å deklarere dem globalt med use vars
('$hilsen', '$person');. Om du vil konkatenere strenger, kan du
bruke "." (punktum) mollom strengene.
En viktig poeng:
| ||||
Del 7: Arrays | |||||
|---|---|---|---|---|---|
|
En liste av "skalare verdier" indeksert med tall, der første
indeksverdi er null.
Det er verdt å merke seg at vi skriver ut et enkeltelement inni an array som $array[1] og ikke som @array[1]!
Grunnen til dette er at vi vanligvis ønsker å få tak i en enkel verdi,
og ikke en array! Om du absolutt må ha en array som resultat, kan du
gjøre som så:
Utover dette finnes det en del funksjoner som behandler "arrays", og er par av disse er:
Et eksempel uten videre dyp forklaring...
| |||||
Del 8: Hashes (assosiative arrays?) | ||||
|---|---|---|---|---|
|
En assosiativ array, eller "hash", består av tilordnede
nøkkel- og verdi-par hvor nøkkelen peker til en verdi:
Merk at vi også her bruker '$' for å trekke ut en skalar verdi. For å gå igjennom alle verdiene i en hash så kan man bruke følgende prosedyre:
Denne vil gå igjennom alle nøklene og verdiene for deretter å skrive dem ut. Nøkkelfunksjonen her er keys (pun intended), som
returnerer alle nøklene i %hash (tilsvarende finnes det
en en values funksjon). Man kan selvfølgelig utvide dette
for å gjøre mer komplekse ting med hashen f.eks:
| ||||
Del 9: Subrutiner i perl | ||
|---|---|---|
|
Bruk
Det er også likegyldig hvor i programemt vi definerer funksjonen - det er ditt ansvar å skrive ryddig kode! | ||
Del 10: Hvordan kjøre et perl-script | ||
|---|---|---|
|
Følgende punkter må være i orden for at programmet skal kunne kjøre:
| ||
Del 11: Spesielle variabler | |||||
|---|---|---|---|---|---|
|
De "spesielle variablene." De er ofte sett på som det "mest ekle" ved
perl, og det er de som tillater å skrive et program virkelig raskt -
på godt og ondt. Du slipper ikke unna dem! En spesiell detalj ved
disse, er at du ikke kan bruke
@ARGV...Er et predefinert array som inneholder kommandolinjeargumentene. Om du kjører perl-scriptettest.pl med parameter
"start" vil argumentet bli plassert $ARGV[0]
(og tilsvarede $ARGV[1] for det andre argumenter, osv.)
@_@_ er et predefinert array som brukes til å
gjøre argumentene til en funksjon tilgjengelig inni
funksjonen. Dette vil si at alle subrutiner mottar argumentene sine i
et array - noe som tillater en vilkårlig mengde parametere!
$_$_ er meget spesiell. Dette er "default-variabelen"!
Svært mange funksjoner i perl godtar å bli kjørt
uten parametere i det hele tatt, eller uten å vise til hvilke
variabler som blir behandlet. Når dette er tilfelle, vil alltid
innholdet i $_ bli brukt!
$!Denne variabelen inneholder feilmeldingsteksten til den siste feilen som oppstod. For eksempel om du prøver å åpne en fil for lesing, og feiler, vil årsaken til feilen stå der.
$0$0 inneholder programnavnet.
%ENVInneholder miljøvariablene! Vil du vite hva $USER er satt til?print $ENV{USER};!
$@Inneholder en eventuell feilmelding fra filsystemet om et system-kall har feilet. (Mere omsystem() kommer senere!)
| |||||
Del 12: Exterior: Dagobah -- day | |
|---|---|
|
With Yoda strapped to his back, Luke climbs up one of the many thick vines that grow in the swamp until he reaches the Dagobah statistics lab. Panting heavily, he continues his exercises -- grepping, installing new packages, logging in as root, and writing replacements for two-year-old shell scripts in Python.
Yoda:Code! Yes. A programmer's strength flows from code maintainability. But beware of Perl. Terse syntax... more than one way to do it... default variables. The dark side of code maintainability are they. Easily they flow, quick to join you when code you write. If once you start down the dark path, forever will it dominate your destiny, consume you it will.
Luke:Is Perl better than Python?
Yoda:No... no... no. Quicker, easier, more seductive.
Luke:But how will I know why Python is better than Perl?
Yoda:You will know. When your code you try to read six months from now.(Funnet på rec.humor.funny, og gjengitt uten tillatelse siden forfatter er ukjent. ;^) | |
Del 13: Enda flere spesielle variabler | |||
|---|---|---|---|
|
Åh nei...Joda. Det finnes mange, og vi tar et par til som er kjekke å vite om.
$/$/ kalles "the input record seperator", og bestemmer hva
som skal være skilletegnet mellom hvert element su leser fra en
filehandle. Standardverdi er "\n", som medfører at man
leser kun en linje om gangen.
$\"Output record seperator" er skilletegnet mellom hvert element i et array! Standardverdi er"", så det dukker ikke opp noe
mellom hvert element.
| |||
Del 14: Filbehandling | |||
|---|---|---|---|
|
Hvordan leser man fra en fil?Pass på å sjekke returverdier, hva en du åpner!
Hvordan skriver man til en fil?Sjekk av returverdi! Sjekk returverdi!
| |||
Del 15: open() | |||
|---|---|---|---|
|
En liten oversikt over hva open() kan gjøreMan bruker open til å kjøre klar filen for skriving eller lesing, og oppretter i prosessen en "filehandle" som man bruker under resten av behandlingen. I vårt tilfelle heter den FILE. Her kommer en liten oversikt over de forskjellige måtene å brukeopen på:
The diamond operatorEn spesiell filehandle en "the diamond operator"<>. Om programmet ditt ikke tr noen argumenter vil
<> lese fra STDIN. I motsatt tilfelle vil alle
argumentene kunne tolkes som filnavn og automatisk leses inn. Det går
ikke an å skrive til "the diamond operator".
| |||
Del 16: Betingelser og Kontrollstrukturer | |||
|---|---|---|---|
|
Perl inneholder selvfølgelig de fleste kontrollstrukturene man har
bruk for...
Forøvrig finnes det et par andre varianter av if-testen:
| |||
Del 17: Logiske operatorer | ||
|---|---|---|
|
Perl har to logiske operatorer,
| ||
Del 18: Sannhetsverdier | ||
|---|---|---|
|
Hva er sant?Vi snur heller på spørsmålet - Hva er usant?
Alt annet tar perl som god fisk - om du fikk 1, "ingen" eller "-99" fisk vil perl være enig med deg. En liten detalj: perl tror deg dersom du sier du fikk "0.0" fisk! Dvs. "0.0" er sann... :) | ||
Del 19: Løkker | ||||
|---|---|---|---|---|
|
While og Until-løkkerwhile-løkker blir kjørt såfremt startbetingelsen er
møtt. I det startbetingelsen ikke lenger er sann vil programmet gå ut
av løkken.
Løkker kan også skrives som ...
... som tilsvarer while( ! $event )
For-løkkerDenne bør være kjent.
| ||||
Del 20: Kall på eksterne programmer | |||||
|---|---|---|---|---|---|
|
`backticks` og system()Ikke sjeldent vil det være interessant å starte opp eksterne programmer i et perl-script. For eksempel ønsker man å sende et e-brev, og starter sendmail for å gjøre dette, eller man vil ha en oversikt over hvilke prosesser som er i gang på maskinen. Det finne flere måter å gjøre dette på, og 'backticks' er en:
Det er bakoverfnuttene ( ``) som forteller perl at den
skal kjøre en system-kommando. Bakoverfnuttene fungerer også som
vanlige fnutter, ved at variabler blir interpolert.
Ta en titt på perldoc -tf system om du trenger å forstå
returverdiene.
exec() - og open() igjenexec() gjør det samme som system() men den
eneste forskjellen at perl-prosessen din ditt blir erstattet av
programmet du exec()'er.
I tillegg kan man bruke open() som vi husker fra
filbehandlingsdelen:
| |||||
Del 21: Faremomenter ved kall på eksterne programmer! | ||
|---|---|---|
|
Hva kan gå galt?Gitt følgende uheldige scenario:
Ingen ønsker å oppleve dette - derfor er det viktig å passe på å lage perl-programmene sine skikkelige - SPESIELT HVIS ANDRE SKAL BRUKE DEM!!
Hvordan unngå å drite seg ut?Et par gode triks er:
| ||
Del 22: Regulære uttrykk (regular expressions) | ||||||||
|---|---|---|---|---|---|---|---|---|
|
Perl sitt mest berømte våpenRegexp er perl sin største og mest populære styrke. Man kan med svært enkle konstuksjoner representere komplekse data. Regulære uttrykk blir oftest brukt til analyse, eller uthenting og endring av data i store mengde tekst.
Her er kortversjonen av hva som er mulig med regulære uttrykk:
For å enkelt lage kraftigere uttrykk trenger vi flere elementer ("Kvantifiserere"?).
Grådige uttrykkI utgangspunktet er alle "Kvantifiserere" grådige - de ønsker å matche mest mulig, og om de få sjansen gjør de det. Det er ikke alltid vi er interessert i dette - noen ganger er vi f.eks. interessert i å få teksten mellom to apostrofer, men det er flere apostrofer på samme linje! For å unngå dette, kan vi legge til et spørsmålstegn etter "kvantifikatoren", så vil den prøve å matche minst mulig.
Det går også an å legge til "ankre"! Hvis vi vet at en bestemt tekst er ved begynnelsen eller ved slutten av en linje, går det an å bruke. I tillegg bør du vite at man kan
Og for å utføre en operasjon med regulære uttrykk, kan du gjøre.
Regexp-operatorerDu kan forandre hvordan et regulært uttrykk fungerer ved å legge til en eller flere operatorer etter uttrykket. De vanligste erm//gimsx; - det finnes fler, men de bryr vi oss ikke om
nå.
| ||||||||
Del 23: Nøstede datastrukturer | ||||
|---|---|---|---|---|
|
ReferansemagiNøstede datastrukturer, det vil si datastrukturer inni datastrukturer lager vi med hjelp av referanser. Eksempler kan være flerdimensjonelle arrays eller hasher av hasher.
Her har vi en array som inneholder fire elementer. De to første er skalare, det tredje er en anonym array, og det fjerde en anonym hash. Gitt koden ovenfor, er følgende utsagn sanne:
Vi kan lage en referanse til @array, og om vi gjør det
vil ting bli mer interessante. Gitt første uttrykk her, så er resten
sanne:
Alt dette kan kombineres hvordan du vil - bar husk å holde orden! | ||||
Del 24: Moduler og 'package' | |||
|---|---|---|---|
|
En enkel modulPrøv! Dette er ikke komplisert.
| |||
Del 25: OO-programmering | |||
|---|---|---|---|
|
Litt om hva som finnesObjekt-orientert programmering i perl er en litt pussig opplevelse. En del av OO-teorien er blitt droppet! - det finnes f.eks. ikke egne "public" eller "private" -egenskaper. Enkapsulasjon må programmereren selv sørge for å ikke bryte. Perl-objekter har likevel de viktigste elementene som modularitet, arv (også multippel arv, om vi trenger det), polymorfisme og annet. En klasse i perl lages ved å opprette en fil med en egen pakke i seg, og passe på at det finnes en konstruktor. Funkjonene i pakken er da metodene i klassen, globale variabler i pakkens navneromm bli klasse-variabler, og variablen konstrukoren returnerer blir objekt-variabler. Verre er det ikke!
| |||
Del 26: En CGI-modul | ||
|---|---|---|
|
CGI_LiteEn lett-versjon av den (mye) kraftigere CGI-modulen i perl - denne passer bedre til enkle oppgaver, og er ikke så tung for systemet.
| ||
Del 27: Referanser | |
|---|---|
|
Nyttige linker
Online dokumentasjon
Bøker
| |
Del 28: XML::Parser og XML::RSS | ||
|---|---|---|
|
'Mine overskrifter'Scriptet, beskrivelse av det og eksempler på bruk kan du finne på http://www.webreference.com/perl/tutorial/8/ .
| ||
Del 29: Annet? | |
|---|---|
|
Så kan man spørre...perl -e 'print "Hva nå?\n";'
| |