commit f46dae2dea6477d7cece591ee59f1aae8c0bc6d5
Author: Kursmester <kurs@pvv.ntnu.no>
Date:   Wed Mar 5 12:33:13 2025 +0100

    Recover from microbel

diff --git a/Hello.pl b/Hello.pl
new file mode 100644
index 0000000..7d5d6d3
--- /dev/null
+++ b/Hello.pl
@@ -0,0 +1,31 @@
+# Ny fil! Dette er "hils.pl"
+
+package main;   # Hoved-navnerommet heter "main", og trengs ikke �
+                # annonseres p� denne m�ten, egentlig. Med mindre vi
+                # har flere "package" i samme fil...
+
+use Hello;
+
+my $friend = Hello::person("Gorm", "M");
+
+my @other_friends = (
+        Hello::person("Natalija", "K"),
+        Hello::person("Remi", "M") );
+
+# Og s� hilser vi po et par venner :)
+
+Hello::hils( $friend );
+Hello::hils( $other_friends[0] );
+Hello::hils( $other_friends[1] );
+Hello::hils( $friend );
+Hello::hils( $other_friends[0] );
+Hello::hils( $friend );
+Hello::vis_ant_hilsninger( $friend );
+Hello::vis_ant_hilsninger( $other_friends[0] );
+Hello::vis_ant_hilsninger( $other_friends[1] );
+
+__END__
+
+Ferdig! Vi kunne ha f�tt penere kode ved � importere symbolene fra
+Hello.pm, men da mister vi fordelen av � vite n�yaktig hvilken pakke
+funksjonene h�rer til i.
diff --git a/Hello.pm b/Hello.pm
new file mode 100644
index 0000000..49c872d
--- /dev/null
+++ b/Hello.pm
@@ -0,0 +1,37 @@
+
+# Vi starter med � lage en fil som vi kaller Hello.pm
+
+package Hello;   # Samme navn som fila, men uten ".pm"
+
+# Om fila het Hello/World.pm, m� vi kalle pakken Hello::World
+
+sub person {
+        my $navn = shift;
+        my $kjonn = shift;
+
+        die "person() skal ha 2 argumenter" unless @_ == 0;
+        die "$navn sitt kj�nn m� v�re 'M' eller 'K'! (ikke '$kjonn')\n"
+            unless $kjonn =~ m/^[MK]$/;
+
+        return [ $navn, $kjonn, 0 ]; # siste tallet er en "hilse-teller"
+}
+
+sub hils {
+        my $person = shift;  # vi venter oss returverdien fra person()
+        my $hva = $person->[1] eq "M" ? "han" : "hun";
+        my $hvem = $person->[0];
+
+        $person->[2]++;  # hvor mange ganger $person er blitt hilst p�?
+
+        print "Nei, se! Der har vi jo $hva $hvem!\n";
+}
+
+sub vis_ant_hilsninger {
+        my $person = shift;
+        my $hvem = $person->[0];
+        my $ant = $person->[2];
+        print "Vi har hilset p� $hvem $ant gang",
+            ( $ant-1 ? "er" : "" ), "\n";
+}
+
+1;   # det er viktig at alle moduler returnerer en sann verdi!
diff --git a/Hello2.pl b/Hello2.pl
new file mode 100644
index 0000000..8159b6b
--- /dev/null
+++ b/Hello2.pl
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+# Ny fil! Dette er "Hello2.pl"
+
+use strict;
+use diagnostics;
+
+use Hello2; # Hello22.pm m� v�re tilgjegelig i @INC for at dette skal
+           # fungere smertefritt.
+
+my $friend = Hello2->new("Gorm", "M");
+
+my @other_friends = (
+        Hello2->new("Natalija", "K"),
+        Hello2->new("Remi", "M") );
+
+# Og s� hilser vi po et par venner :)
+
+print $friend->hils();
+print $other_friends[0]->hils();
+print $other_friends[1]->hils();
+print $other_friends[1]->hils();
+print $friend->hils();
+print $other_friends[1]->hils();
+print $other_friends[0]->hils();
+
+print $friend->vis_navn(), " hilset ",
+	$friend->vis_ant_hilsninger(), " ganger\n";
+print $other_friends[0]->vis_navn(), " hilset ",
+	$other_friends[0]->vis_ant_hilsninger(), " ganger\n";
+print $other_friends[1]->vis_navn(), " hilset ",
+	$other_friends[1]->vis_ant_hilsninger(), " ganger\n";
+__END__
diff --git a/Hello2.pm b/Hello2.pm
new file mode 100644
index 0000000..159f6ec
--- /dev/null
+++ b/Hello2.pm
@@ -0,0 +1,56 @@
+# Vi pr�ver oss p� nytt, og lager en fil som vi kaller Hello.pm
+
+package Hello2;   # Nesten som f�r...
+
+sub new {   # Vanlig navn p� en konstruktor er "new" - ingen tvang!
+        my $package = shift;  # f�rste argument er alltid en referanse
+                              # til 
+        my $navn = shift;
+        my $kjonn = shift;
+
+        die "new() skal ha 2 argumenter" if @_;
+        die "$navn sitt kj�nn m� v�re 'M' eller 'K'! (ikke '$kjonn')\n"
+            unless $kjonn =~ m/^[MK]$/;
+
+        my $person = {
+                navn      => $navn,
+                kjonn     => $kjonn,
+                _ant_hils => 0  };
+
+        bless( $person, $package ); # Her knytter vi $person til
+                                    # $package, slik at vi f�r
+                                    # effekten av en klasse.
+        return $person;
+}
+
+sub hils {
+        my $self = shift;
+        my $hva = $self->{kjonn} eq "M" ? "han" : "hun";
+        my $hvem = $self->{navn};
+
+        $self->{_ant_hils}++;  # hvor mange ganger "jeg" er blitt hilst p�?
+
+        return "Nei, se! Der har vi jo $hva $hvem!\n";
+}
+
+sub vis_ant_hilsninger {
+        my $self = shift;
+        return $self->{_ant_hils};
+}
+
+sub vis_navn {
+        my $self = shift;
+        return $self->{navn};
+}
+
+sub vis_kjonn {
+        my $self = shift;
+        return $self->{kjonn};
+}
+
+1;   # S� avslutter vi med en sann verdi.
+
+
+
+
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..297c580
--- /dev/null
+++ b/README.md
@@ -0,0 +1,25 @@
+# Perl-kurs 28. og 29. april 1999
+
+Programvareverkstedet (PVV) avslutter semesteret med å arrangere et
+kurs i Perl-programmering. Kurset går over to kvelder og gir en
+grunnleggende innføring i Perl. Kurset vil også gi en innføring i
+oppgaver Perl er godt egnet til, samt litt om hvordan du kan lage dine
+egne CGI-scripts i Perl.
+
+Kurset vil foregå i auditorium EL5 på Gløshaugen (oppmøte i PVVs
+lokaler første kveld) onsdag 28. og torsdag 29. april. Begge dager
+holder vi på fra 18.30 til ca. 21.00.
+
+Kursavgiften er kr. 30,- for medlemmer i PVV og kr. 80,- for
+ikke-medlemmer, og dekker kursmateriell i form av et 20 siders
+kompendium.  Det er mulig å bli medlem på første kurskveld;
+medlemskap koster kr. 42,- pr. år.
+
+Påmelding gjøres per e-post innen onsdag 28. april klokken 12.00 til
+adressen [kurs@pvv.ntnu.no](mailto://kurs@pvv.ntnu.no).
+
+## Mer info om Perl
+
+- [PERL.COM](http://www.perl.com)
+- [The Perl Institute](http://www.perl.org)
+- [What is Perl?](http://tpj.com/whatisperl.html)
diff --git a/navn.cgi b/navn.cgi
new file mode 100755
index 0000000..6a383c3
--- /dev/null
+++ b/navn.cgi
@@ -0,0 +1,48 @@
+#!/store/bin/perl -wT
+#
+# Et enkelt CGI-script som returnerer data du har gitt.
+
+use strict;
+use diagnostics;
+use CGI_Lite;
+
+my $cgi = new CGI_Lite; # En annen m�te � lage et objekt p�
+
+$cgi->set_platform("Unix");
+$cgi->add_mime_type("text/html");
+
+my %form = $cgi->parse_form_data; # Hente inn data fra browser
+
+$/ = undef; # Vi vil ha alt p� en gang n�r vi leser fra en filehandle
+
+my $page = <DATA>; # Leser fra __DATA__ nedenfor
+
+foreach my $data_key (keys %form) {
+        # Bytte ut f.eks. $NAVN med $form{NAVN}
+        $page =~ s/\$$data_key/$form{$data_key}/gm;
+}
+
+$page =~ s/\$\w+/foo/gm;
+
+print "Content-type: text/html\r\n\r\n";
+print $page;
+
+__DATA__
+<HTML>
+<HEAD><TITLE>CGI_Lite-test</TITLE></HEAD>
+<BODY>
+
+<H1>Hei, $NAVN</H1>
+
+Du er $ALDER �r gammel, har jeg h�rt!
+
+<HR>
+
+<FORM METHOD="POST" ACTION="navn.cgi">
+Navn: <INPUT TYPE="text" NAME="NAVN" VALUE="$NAVN"><BR>
+Alder: <INPUT TYPE="text" NAME="ALDER" VALUE="$ALDER"><BR>
+<INPUT TYPE="submit">
+</FORM>
+
+</BODY>
+</HTML>
diff --git a/navn.pl b/navn.pl
new file mode 120000
index 0000000..a99030f
--- /dev/null
+++ b/navn.pl
@@ -0,0 +1 @@
+navn.cgi
\ No newline at end of file
diff --git a/perlkurs.css b/perlkurs.css
new file mode 100644
index 0000000..fdc0fd6
--- /dev/null
+++ b/perlkurs.css
@@ -0,0 +1,29 @@
+A { 
+	text-decoration:	none;
+}
+
+TABLE { }
+
+TABLE.perlcode {
+	font-family:	"Courier" ! important;
+        white-space:	pre;
+}
+
+TD { }
+
+TD.perlcode {
+	font-family:	"Courier" ! important;
+        white-space:	pre;
+	width:		50%
+}
+
+PRE {
+	font-family:	"Courier" ! important;
+        white-space:	pre;
+	width:		50%
+}
+
+CODE {
+	font-family:	"Courier" ! important;
+	background:	#eeeeee;
+}
diff --git a/perlkurs.html b/perlkurs.html
new file mode 100644
index 0000000..01bd148
--- /dev/null
+++ b/perlkurs.html
@@ -0,0 +1,1976 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+   "http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+
+<HEAD>
+<LINK REL="StyleSheet" HREF="perlkurs.css" TYPE="text/css" MEDIA="screen">
+<TITLE>Perlkurset, H�st'99</TITLE>
+
+<META NAME='version' CONTENT='1.96'>
+
+<META NAME='author' CONTENT='Salve J. Nilsen'>
+
+</HEAD><BODY BGCOLOR=white>
+<P><H1><FONT SIZE=+4>Perlkurset, H�sten '99</FONT></H1>I regi av Programvareverkstedets Faglige Forum</P>
+<HR><P><TABLE WIDTH=100%>
+<TR><TD WIDTH=80%><H2>Kursoversikt</H2>
+Kurset 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! :^)</TD><TD></TD></TR></TABLE></P>
+
+
+<A NAME='C1'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 1: Hva er Perl?</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Liten</H3>
+
+<CODE>perl -e 'print "Hello, World!\n";'</CODE>
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>&Aring;pen</H3>
+
+"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.
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Kraftig</H3>
+
+Perl 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.
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>'Naturlig'</H3>
+
+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.
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Til fare for liv og helse!</H3>
+
+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�!
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Litt st&oslash;rre</H3>
+
+Om 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.)
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+#!/usr/bin/perl
+# En obfuskert signaturfil?
+($_='$ZNVYGB+$FWA?$CII:$BET;')?y:;ZA-Y\:?+${':\nm-za-l.@\:\0:?print:'}.':'.$';
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C2'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 2: Pathologically Eclectic Rubbish Lister</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Hva egner perl seg til?</H3>
+
+<UL>
+
+ <LI>Vanlige og uvanlige systemadministrasjonsoppgaver.
+</LI>
+
+ <LI>Nettverkskommunikasjon.
+</LI>
+
+ <LI>CGI-programmering.
+</LI>
+
+ <LI>"Rapid Prototyping."
+</LI>
+
+ <LI>"Lim" mellom applikasjoner.
+</LI>
+
+ <LI>Effektiv behandling av store mengder tekst (HTML? XML?
+loggfiler?)
+</LI>
+
+</UL>
+
+</P>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Hva egner det seg ikke til?</H3>
+
+<UL>
+
+ <LI>Sv�rt store og/eller komplekse prosjekter.
+</LI>
+
+ <LI>Arbeidsoppgaver der maskinressursene er knappe.
+</LI>
+
+ <LI>Oppgaver det programmet krever sv�rt rask utf�relse og/eller h�y
+responstid.
+</LI>
+
+</UL>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Men tenk over oppgaven!</H3>
+
+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? :^)
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C3'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 3: Latskap, Ut&aring;lmodighet og Hovmod!</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Perl-programmererens tre dyder</H3>
+
+<UL>
+
+ <LI>Latskap, fordi du velger � skrive kode en gang, slik at det ogs�
+kan brukes andre steder og av andre. Merk ogs� at du dokumenterer
+skikkelig, for da slipper du � svare p� dumme sp�rsm�l fra folk som
+bruker koden din!
+</LI>
+
+ <LI>Ut�lmodighet, fordi du ikke vil vente p� datamaskinen hele
+tiden, og heller passer p� at koden din ikke bare reagerer p� behovene
+dine, men faktisk forutser dem!
+</LI>
+
+ <LI>Hovmod, fordi det f�r deg til � skrive kode som andre ikke vil
+kritisere.
+</LI>
+
+</UL>
+
+F�lg dem, og alt g�r s� meget bedre!
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C4'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 4: Fordeler og Ulemper</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Plusspoeng</H3>
+
+<UL>
+
+ <LI>Perl er et h�yniv� spr�k med tilgang p� lavniv� kall om man
+trenger det.
+</LI>
+
+ <LI>� programmere i perl g�r fort - man kan f� mye effekt ut av f�
+linjer kode, noe som man kan oversette direkte til spart tid og
+penger.
+</LI>
+
+ <LI>Perl har et rikt utvalg av moduler som omhandler alt fra
+kryptering og autentisering til verkt�y som kan brukes i
+molekyl�rbiologi og til � samle e-postaadresser p� USENET. (Ikke gj�r
+det!)
+</LI>
+
+ <LI>Perl har flere innebygde sikkerhetsfunksjoner, og et godt utvalg
+med moduler som gj�r livet lettere.
+</LI>
+
+ <LI>Det g�r an � "vokse" med spr�ket, siden det er enkelt, kraftig
+og smidig. Det er alltid noe nytt du kan l�re og et triks som gj�r
+programmeringen morsommere. (Perl er en skrekk for spr�kminimalister.)
+</LI>
+
+</UL>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Minuspoeng</H3>
+
+<UL>
+
+ <LI>Perl tar - og beholder - alt den trenger av ressurser. Det er
+ikke vanskelig � sluke alle ressursene p� en maskin om man ikke passer
+p�!
+</LI>
+
+ <LI>Kildekoden i et perl-program kan lett gj�res uleselig!  Pr�v �
+s�ke etter "Obfuscated Perl contest" p� nettet, og forbered deg p� en
+stygg hodepine.
+</LI>
+
+ <LI>Spr�ket kan for enkelte v�re tungt � l�re/bruke p� grunn av
+mengden med "spesialvariabler."
+</LI>
+
+ <LI>Perl er en skrekk for spr�kminimalister. (Det g�r an � "vokse"
+med spr�ket, siden det er enkelt, kraftig og smidig. Det er alltid noe
+nytt du kan l�re og et triks som gj�r programmeringen morsommere.)
+</LI>
+
+ <LI>Spr�ket l�rer deg ikke � programmere godt/pent - det m� du gj�re
+selv! Ikke bli fristet til � skrive "bruk og kast-kode".
+</LI>
+
+</UL>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C5'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 5: Datastrukturer i Perl</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+I perl opererer man i hovedsak med tre typer data (det finnes flere,
+men de er ikke s� viktige i starten.)
+<UL>
+
+ <LI>"Scalar" - Et enkeltelement (tekst, tall, pekere, m.m.) -
+<CODE>$foo</CODE>.
+</LI>
+
+ <LI>"Array" - En liste av enkeltelementer, med tall fra null og
+oppover som indeksverdier - <CODE>@bar</CODE>, <CODE>$bar[0]</CODE>
+eller <CODE>$bar[$tall]</CODE>.
+</LI>
+
+ <LI>"Hash" - En liste med navngitte indeksverdier i stedet for tall
+("Hashes" ogr ogs� kjent som "Assosiative Arrays") -
+<CODE>%baz</CODE>, <CODE>$baz{tekst}</CODE> eller
+<CODE>$baz{$indeks}</CODE>.
+</LI>
+
+</UL>
+
+Variabler og datastrukturer trenger ikke � forh�ndsdeklareres, men kan
+istedet opprettes n�r man trenger dem. Dette betyr ikke at det er dumt
+� deklarere dem p� for�nd! Faktisk, glem det jeg skrev om valgfri
+forh�ndsdeklarering, og lat som om du m� gj�re det!
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C6'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 6: Scalars (skalare verdier?)</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+Skalare verdier angis ved � bruke en '$' foran
+variabelnavnet. <CODE>$navn</CODE> vil angi at den enten er en streng,
+et tall eller en referanse. I alle tilfeller vil variabelen kun
+inneholde en eneste verdi.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $hilsen = 'heisann';
+my $person = 'Per';
+print "$hilsen, $person! Har du det bra?\n";
+my( $svar, $tilstand ) = ( "joda", "bra" );
+print "$svar, det g�r $tilstand.\n";
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+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 <CODE>my()</CODE>
+foran variabelen, eller ved � deklarere dem globalt med <CODE>use vars
+('$hilsen', '$person');</CODE>. Om du vil konkatenere strenger, kan du
+bruke "<CODE>.</CODE>" (punktum) mollom strengene.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $tid = scalar localtime;  # hva gj�r scalar() ?
+print "Vi fanget dette �yeblikket: " . $tid;
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+En viktig poeng:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $tekst = "foo";
+print "Med doble fnutter: $tekst";
+print 'Med enkle fnutter: $tekst';  # hva er forskjellen?
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C7'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 7: Arrays</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+
+En liste av "skalare verdier" indeksert med tall, der f�rste
+indeksverdi er null.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my @array = ( "a", "b", "c", "d" );
+print $array[1];   # Skriver ut "b"
+$array[2] = "foo";
+print @array;      # Skriver ut "afoocd"
+print "@array";	   # Med resultat "a foo c d"
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Det er verdt � merke seg at vi skriver ut et enkeltelement inni an
+array som <CODE>$array[1]</CODE> og ikke som <CODE>@array[1]</CODE>!
+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�:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my @nok_en_array = @array[0,2];
+print "@nok_en_array" # Vi f�r "a c"
+my @enda_en_array = @array[0..2];
+print "@enda_en_array" # Skriver ut "a foo c"
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Utover dette finnes det en del funksjoner som behandler "arrays", og
+er par av disse er:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+push(@array, "verdi2");
+my $var1 = pop(@array);
+unshift(@array, "verdi2");
+my $var2 = shift(@array);
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Et eksempel uten videre dyp forklaring...
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my @array = ("a", "b", "c");
+my $last = pop(@array);
+push(@array, "e");
+my $first = shift(@array);
+unshift(@array, "d");
+print @array; # Skriver ut "dbe"
+ 
+foreach my $verdier (@array) {
+        print "$verdier\n";
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C8'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 8: Hashes (assosiative arrays?)</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+En assosiativ array, eller "hash", best�r av tilordnede
+n�kkel- og verdi-par hvor n�kkelen peker til en verdi:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my %hash = (key1 => 1,
+            key2 => "tekst",
+	    key3 => 3);
+print $hash{key1};     # Skriver "1"
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+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:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+foreach my $key (keys %hash) {
+        print "$key => $hash{$key}\n";
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Denne vil g� igjennom alle n�klene og verdiene for deretter � skrive
+dem ut. N�kkelfunksjonen her er <CODE>keys</CODE> (pun intended), som
+returnerer alle n�klene i <CODE>%hash</CODE> (tilsvarende finnes det
+en en <CODE>values</CODE> funksjon). Man kan selvf�lgelig utvide dette
+for � gj�re mer komplekse ting med hashen f.eks:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my %count_hash;
+foreach my $key (sort keys %hash) {
+        # teller antall forekomster av bestemte verdier i en hash.
+        ++$count_hash{$hash{$key}};
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C9'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 9: Subrutiner i perl</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+Bruk <CODE>my();</CODE>! Dette er spesielt viktig i funksjoner
+s� variablene er unike for den navnerom de blir deklarert
+i. Godt tips som du allerede b�r vite: Bruk aldri globale
+variabler! De skaper bare problemer.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+print pluss(7, 77);  # Skriver ut "84"
+
+sub pluss {
+        my( $argument1, $argument2 ) = @_; # Argumenter ligger i @_
+        return $argument1 + $argument2;
+}
+
+print pluss(4, 19);  # Skriver ut "23"
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Det er ogs� likegyldig hvor i programemt vi definerer funksjonen
+- det er ditt ansvar � skrive ryddig kode!
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C10'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 10: Hvordan kj&oslash;re et perl-script</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+F�lgende punkter m� v�re i orden for at programmet skal kunne kj�re:
+<UL>
+
+ <LI>Maskinen du logger inn p� p� ha perl installert! Dette kan du
+finne ut med <CODE>which perl</CODE>.
+</LI>
+
+ <LI>Pass p� at du har en ny versjon av perl. Dette kan du finne ut
+med <CODE>perl -v</CODE>. Versjon 5.004_04 eller nyere er bra, 5.003
+eller nyere g�r an, og om du har noe eldre en det, oppgrader. Om du
+skulle v�re uheldig nok til � ha en versjon 4 perl, s� bli kvitt den
+med en gang! Perl 4 er d�d, og vil aldri mere bli oppdatert!
+</LI>
+
+ <LI>Lag en fil og plasser i toppen av fila. F�rste bokstav i fila
+skal v�re "#"! Strengt tatt er ikke <CODE>-wT</CODE>, <CODE>use
+strict;</CODE> og <CODE>use diagnostics;</CODE> n�dvendig, men de er
+fryktelig nyttige � ha der mens du lager programmet - n�r du er ferdig
+kan du ta dem vekk igjen.
+</LI>
+
+</UL>
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+#!/usr/bin/perl -wT
+
+use strict;
+use diagnostics;
+</PRE></FONT></TD></TR></TABLE><BR>
+
+<UL>
+
+ <LI>Pass p� � erstatte <CODE>/usr/bin/perl</CODE> med resultatet til
+<CODE>which perl</CODE> om det er ulikt, ellers vil du ikke f� kj�rt
+programmet.
+</LI>
+
+ <LI>Det er viktig at fila er eksekverbar! Dette fikser du med
+<CODE>chmod(1)</CODE> kommandoen. <CODE>man chmod</CODE> hjelper
+deg der om du ikke er kjent med kommandoen.
+</LI>
+
+</UL>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C11'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 11: Spesielle variabler</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+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 <CODE>my();</CODE> for � gj�re dem til
+lokale variabler. Som oftest gj�r ikke det noe, men om du
+f.eks. �nsker � endre an spesialvariabel inni en subrutine, uten at
+"orginalen" blir �delagt, bruk <CODE>local();</CODE>. Merk at det
+finnes mange fler, men det er som oftest disse du vil m�te f�rst.
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>@ARGV</H3>
+
+...Er et predefinert array som inneholder kommandolinjeargumentene. Om
+du kj�rer perl-scriptet <CODE>test.pl</CODE> med parameter
+<CODE>"start"</CODE> vil argumentet bli plassert <CODE>$ARGV[0]</CODE>
+(og tilsvarede <CODE>$ARGV[1]</CODE> for det andre argumenter, osv.)
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>@_</H3>
+
+<CODE>@_</CODE> 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!
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+sub foo { print $_[1] }   # Skriver ut andre argument i @_
+
+foo("A", "B", "C");       # "B" blir skrevet ut!
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>$_</H3>
+
+<CODE>$_</CODE> 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 <CODE>$_</CODE> bli brukt!
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+$_ = "En test\n";
+print;      # Skriver ut "En test\n"
+
+my @array = ( 1, 1, 2, 3, 5, 8, 13, 21 );
+foreach ( @array ) { # Et og et element i @array blir plassert i $_
+        print;       # ... og skrevet ut!
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>$!</H3>
+
+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.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $filnavn = "/etc/passswd";
+open( FIL, "&lt;$filnavn" ) || die "Kan ikke lese fra '$filnavn': $!\n";
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>$0</H3>
+
+<CODE>$0</CODE> inneholder programnavnet.
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>%ENV</H3>
+
+Inneholder milj�variablene! Vil du vite hva $USER er satt til?
+<CODE>print $ENV{USER};</CODE>!
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>$@</H3>
+
+Inneholder en eventuell feilmelding fra filsystemet om et system-kall
+har feilet. (Mere om <CODE>system()</CODE> kommer senere!)
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+system("ls -l", "/dev/nosuchthing", "/etc", "/usr");
+die "Error: $@\n" if defined $@;
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C12'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 12: Exterior: Dagobah -- day</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+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.
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Yoda:</H3>
+
+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.
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Luke:</H3>
+
+Is Perl better than Python?
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Yoda:</H3>
+
+No... no... no.  Quicker, easier, more seductive.
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Luke:</H3>
+
+But how will I know why Python is better than Perl?
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Yoda:</H3>
+
+You will know.  When your code you try to read six months from now.
+</P>
+
+
+<P CLASS='paragraph'>
+(Funnet p� rec.humor.funny, og gjengitt uten tillatelse
+siden forfatter er ukjent. ;^)
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C13'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 13: Enda flere spesielle variabler</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>&Aring;h nei...</H3>
+
+Joda. Det finnes mange, og vi tar et par til som er kjekke � vite om.
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>$/</H3>
+
+<CODE>$/</CODE> kalles "the input record seperator", og bestemmer hva
+som skal v�re skilletegnet mellom hvert element su leser fra en
+filehandle. Standardverdi er <CODE>"\n"</CODE>, som medf�rer at man
+leser kun en linje om gangen.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+open( PASSWD, "/etc/passwd" ) || die "Kan ikke lese: $!";
+
+my $line = &lt;PASSWD&gt;;
+print $line;
+# "navnsen:sEp4D.g/dg:6000:133:Etter Navnsen:/home/navnsen:/bin/false\n"
+
+local( $/ ) = ":";
+
+my $field = &lt;PASSWD&gt;;
+close( PASSWD );
+
+print $field;
+# "navnsdottir:"
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>$\</H3>
+
+"Output record seperator" er skilletegnet mellom hvert element i et
+array! Standardverdi er <CODE>""</CODE>, s� det dukker ikke opp noe
+mellom hvert element.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my @stuff = qw( datamaskin sykkel dress bestikk );
+
+print @stuff;
+# "datamaskinsykkeldressbestikk"
+
+local( $\ ) = " OG ";
+
+print @stuff;
+# "datamaskin OG sykkel OG dress OG bestikk"
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C14'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 14: Filbehandling</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Hvordan leser man fra en fil?</H3>
+
+Pass p� � sjekke returverdier, hva en du �pner!
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+open( FILE, "&lt;fil.txt" )
+    || die "Kan'ke lese fila 'fil.txt': $!\n";
+while ( &lt;FILE&gt; )  {
+        # Gj�r noe nyttig her.
+	print;
+}
+close FILE || die "Kainn ittj' lukk fil.txt? $!\n";
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Hvordan skriver man til en fil?</H3>
+
+Sjekk av returverdi! Sjekk returverdi!
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+open( FILE, "&gt;fil.txt" )
+    || die "Kan'ke skriv te 'fil.txt': $!\n";
+print FILE "f�rste linje\n";
+close FILE || die "Kainn ittj' lukk fil.txt? $!\n";
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C15'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 15: open()</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>En liten oversikt over hva open() kan gj&oslash;re</H3>
+
+Man 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 � bruke <CODE>open</CODE> p�:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+open(F, "fil");         # lesing
+open(F, "&lt;fil");        # lesing -eksplisitt
+open(F, ">fil");        # skriving
+open(F, "+>fil");       # les og skriv
+open(F, ">>fil");       # tillegg (legge til p� slutten)
+open(F, "|cmd");        # skriv til kommando
+open(F, "cmd|");        # les fra kommando
+open(F, "|-");          # skriv til fork
+open(F, "-|");          # les fra fork
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>The diamond operator</H3>
+
+En spesiell filehandle en "the diamond operator"
+<CODE>&lt;&gt;</CODE>. Om programmet ditt ikke tr noen argumenter vil
+<CODE>&lt;&gt;</CODE> 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".
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+#!/usr/bin/perl -w
+# Et lite program som kommenterer ut hele filer.
+#
+use strict;
+
+while ( &lt;&gt; ) {
+        print "# $_";
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C16'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 16: Betingelser og Kontrollstrukturer</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+Perl inneholder selvf�lgelig de fleste kontrollstrukturene man har
+bruk for...
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+#!/usr/bin/perl -w
+
+print "Skriv et tall: ";
+$tall = &lt;STDIN>;
+chomp($tall);          # fjerne linjeskift
+if ( $tall > 0 ) {
+        print "positivt tall\n";
+elsif ($tall &lt; 0) {
+        print "negativt tall\n";
+} else {
+        print "tallet er 0\n";
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+For�vrig finnes det et par andre varianter av <CODE>if</CODE>-testen:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+unless ($tall == 2) {
+        print "tallet er ikke 2";
+}
+
+# Pr�v "baklengs" notasjon! :
+print "God dag!\n" $natt &amp;&amp; $a_menneske;
+
+# Eller hva med "kort-notasjonen"?
+my $tall = 0;
+print $tall ? "sann\n" : "usann\n";
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C17'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 17: Logiske operatorer</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+
+Perl har to logiske operatorer, <CODE>&amp;&amp;</CODE> (AND) og
+<CODE>||</CODE> (OR). Begge er kortsluttende! dette betyr at "andre
+halvdel" ikke blir sjekket med mindre f�rste halvdel er henholdscis
+sann (for AND) eller usann (for OR). I tillegg finnes <CODE>or</CODE>
+og <CODE>and</CODE>, men ikke bruk de, for de fungerer p� en litt
+annerledes m�te.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+$tall == 2 &amp;&amp; print "tallet er 2\n";
+$tall == 2 || print "tallet er ikke 2\n";
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C18'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 18: Sannhetsverdier</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Hva er sant?</H3>
+
+Vi snur heller p� sp�rsm�let - Hva er usant?
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+print "Dette skal ikke skrives ut\n"
+    if ("" || "0" || 0 || undef);
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+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... :)
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C19'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 19: L&oslash;kker</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>While og Until-l&oslash;kker</H3>
+
+<CODE>while</CODE>-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.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $tall = 0;
+while ($tall &lt; 10) {
+        $tall++;
+        print "n� er l�kken kj�rt $tall ganger\n";
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+L�kker kan ogs� skrives som ...
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+until( $event ) {
+        # gj�r noe her.
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+... som tilsvarer <CODE>while( ! $event )</CODE>
+
+</P>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>For-l&oslash;kker</H3>
+
+Denne b�r v�re kjent.
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+for( $i = 0; $i &lt;= 10; $i++ ) {
+        print $i;
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C20'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 20: Kall p&aring; eksterne programmer</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>`backticks` og system()</H3>
+
+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:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $tidspunkt = `date`;   # Henter klokkeslett og dato fra date(1)
+			  # og legger den i $tidspunkt
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Det er bakoverfnuttene (<CODE>``</CODE>) som forteller perl at den
+skal kj�re en system-kommando. Bakoverfnuttene fungerer ogs� som
+vanlige fnutter, ved at variabler blir interpolert.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $foo = system("date"); # Skriver ut (!) dato, og setter $foo
+                          # til enten 0 eller et tall med statuskoder
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Ta en titt p� <CODE>perldoc -tf system</CODE> om du trenger � forst�
+returverdiene.
+</P>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>exec() - og open() igjen</H3>
+
+<CODE>exec()</CODE> gj�r det samme som <CODE>system()</CODE> men den
+eneste forskjellen at perl-prosessen din ditt blir erstattet av
+programmet du <CODE>exec()</CODE>'er.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+exec( $program, "arg1", "arg2" );
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+I tillegg kan man bruke <CODE>open()</CODE> som vi husker fra
+filbehandlingsdelen:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+open( LS, "ls|" ) || die "Kunne ikke �pne ls: $!\n";
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C21'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 21: Faremomenter ved kall p&aring; eksterne programmer!</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Hva kan g&aring; galt?</H3>
+
+Gitt f�lgende uheldige scenario:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $argument = '/etc; rm -rf / >&amp;- 2>&amp;- &amp;';
+        # Dette kan komme fra en ekstern kilde! kanskje du
+	# leste inn parametere fra &lt;STDIN&gt;?
+
+system("ls -l $argument");  # Oops!
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Ingen �nsker � oppleve dette - derfor er det viktig � passe p� � lage
+perl-programmene sine skikkelige - SPESIELT HVIS ANDRE SKAL BRUKE
+DEM!!
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Hvordan unng&aring; &aring; drite seg ut?</H3>
+
+Et par gode triks er:
+<UL>
+
+ <LI>Unng� � bruke <CODE>``</CODE>, <CODE>system()</CODE>,
+<CODE>exec()</CODE>, <CODE>open()</CODE>, <CODE>opendir()</CODE>,
+<CODE>syscall()</CODE>, <CODE>glob()</CODE> og andre funksjoner som
+aksesserer systemet.
+</LI>
+
+ <LI>Bruk <CODE>-T</CODE> (taint-checking) som parameter til perl!
+</LI>
+
+ <LI>Om du m� bruke <CODE>system()</CODE> og tilsvarende funksjoner,
+pass p� � bruke lister som argumenter i stedet for tekststrenger. Om
+du bruker en tekststreng for to eller flere ord sammen, s� vil perl
+starte et eget skall for � "gj�re fornuft" av
+parameterene. <CODE>system("ls -l $dir1 $dir2")</CODE> er farlig, men
+<CODE>system("ls", "-l", $dir1, $dir2)</CODE> er OK.
+</LI>
+
+</UL>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C22'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 22: Regul&aelig;re uttrykk (regular expressions)</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Perl sitt mest ber&oslash;mte v&aring;pen</H3>
+
+Regexp 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.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+#!/usr/bin/perl -w
+#
+use strict;
+
+while( my $logglinje = &lt;&gt; ) {
+        print ++$teller,": $logglinje" if m/^mandag/;
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Her er kortversjonen av hva som er mulig med regul�re uttrykk:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+bokstav         matcher seg selv
+tall            matcher seg selv
+\.              matcher et punktum
+\tegn           matcher et tegn
+\\              matcher \
+.               matcher alle tegn unntatt "\n"
+[abc]           matcher a, b eller c
+[a-z]           matcher a, b,... y, z
+[^abc]          matcher alt unntatt a,b eller c
+\w              [a-zA-Z0-9_]
+\W              [^\w]
+\s              matcher "whitespace"
+\S              alt annet en whitespace
+\d              [0-9]
+\D              [^0-9]
+\n              matcher newline
+\t              matcher tab
+\b		matcher begynnelsen eller slutten av et ord
+\032            matcher tegn tilsvarende oktalverdien gitt
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+For � enkelt lage kraftigere uttrykk trenger vi flere elementer
+("Kvantifiserere"?).
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+*               matcher 0 eller flere ganger
++               matcher 1 eller flere ganger
+?               matcher 1 eller 0 ganger
+{n}             matcher n�yaktig n ganger
+{n,}            matcher minst n ganger
+{n,m}           matcher minst n og maks m ganger
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Gr&aring;dige uttrykk</H3>
+
+I 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.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $test = '"hah" sa han. Hunden ytret et "voff!"';
+$test =~ m/"(.*)"/;
+print $1;    # Skriver ut 'hah!" sa han. Hunden ytret et "voff!'
+$test =~ m/"(.*?)"/;
+print $1;    # Skriver ut '"hah!"'
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+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
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+^               matcher begynnelsen av linjen
+$               matcher slutten av linjen
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Og for � utf�re en operasjon med regul�re uttrykk, kan du gj�re.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+#!/usr/bin/perl -w
+
+my @rest;
+while( &lt;&gt; ) {
+        s/\r//g;         # Fjerner ^M fra slutten av linja
+	s/[������]/./g;  # Erstatter alle �, � og � med punktum
+	tr/a-z/A-Z/;	 # Gj�r om sm� bokstaver til store
+	m/(ab){2,4}/i;	 # matcher p� abab (el.l.) uten � bry
+			 # seg om store eller sm� bokstaver
+	push(@rest, $_);
+}
+
+my @foos = grep( ! /foo/i, @rest ); # vi trenger linjene uten "foo"
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Regexp-operatorer</H3>
+
+Du kan forandre hvordan et regul�rt uttrykk fungerer ved � legge til
+en eller flere operatorer etter uttrykket. De vanligste er
+<CODE>m//gimsx;</CODE> - det finnes fler, men de bryr vi oss ikke om
+n�.
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+g               Matcher uttrykket globalt
+i		Ignorere store/sm� bokstaver
+m		Behandle dataene over flere linjer
+s		Behandle dataene som om de var p� en linje
+x		Ignorere "unescaped whitespace" - Gj�r 
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C23'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 23: N&oslash;stede datastrukturer</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Referansemagi</H3>
+
+N�stede datastrukturer, det vil si datastrukturer inni datastrukturer
+lager vi med hjelp av referanser. Eksempler kan v�re flerdimensjonelle
+arrays eller hasher av hasher.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my @array = ('foo',
+             'bar',
+	     ['a', 2, 'c'],
+	     {key1 => "verdi1",
+	      key2 => "verdi2"}
+	    );
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+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:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+$array[0} == 'foo';
+$array[2]->[1] == 2;
+$array[3]->{key2} == 'verdi2';
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Vi kan lage en referanse til <CODE>@array</CODE>, og om vi gj�r det
+vil ting bli mer interessante. Gitt f�rste uttrykk her, s� er resten
+sanne:
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+my $aref = \@array;
+$aref->[1] == 'bar';
+$aref->[3]->{key1} == 'verdi1';
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+Alt dette kan kombineres hvordan du vil - bar husk � holde orden!
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C24'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 24: Moduler og 'package'</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>En enkel modul</H3>
+
+Pr�v! Dette er ikke komplisert.
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+# Vi starter med � lage en fil som vi kaller Hello.pm
+
+package Hello;   # Samme navn som fila, men uten ".pm"
+
+# Om fila het Hello/World.pm, m� vi kalle pakken Hello::World
+
+sub person {
+        my $navn = shift;
+	my $kjonn = shift;
+
+	die "person() skal ha 2 argumenter" unless @_ == 0;
+	die "$navn sitt kj�nn m� v�re 'M' eller 'K'! (ikke '$kjonn')\n"
+	    unless $kjonn =~ m/^[MK]$/;
+
+	return [ $navn, $kjonn, 0 ]; # siste tallet er en "hilse-teller"
+}
+
+sub hils {
+        my $person = shift;  # vi venter oss returverdien fra person()
+	my $hva = $person->[1] eq "M" ? "han" : "hun";
+	my $hvem = $person->[0];
+
+	$person->[2]++;  # hvor mange ganger $person er blitt hilst p�?
+
+	print "Nei, se! Der har vi jo $hva $hvem!\n";
+}
+
+sub vis_ant_hilsninger {
+        my $person = shift;
+	my $hvem = $person->[0];
+	my $ant = $person->[2];
+        print "Vi har hilset p� $hvem $antall gang",
+	    ( $ant-1 ? "" : "er" ), "\n";
+}
+
+1;   # det er viktig at alle moduler returnerer en sann verdi!
+</PRE></FONT></TD></TR></TABLE><BR>
+
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+# Ny fil! Dette er "hils.pl"
+
+package main;   # Hoved-navnerommet heter "main", og trengs ikke �
+		# annonseres p� denne m�ten, egentlig. Med mindre vi
+		# har flere "package" i samme fil...
+
+my $friend1 = Hello::person("Gorm", "M");
+
+my @other_friends = (
+        Hello::person("Natalija", "M"),
+	Hello::person("Remi", "M") );
+
+# Og s� hilser vi po et par venner :)
+
+Hello::hils( $friend );
+Hello::hils( $other_friends[0] );
+Hello::hils( $other_friends[1] );
+Hello::hils( $friend );
+Hello::hils( $other_friends[0] );
+Hello::hils( $friend );
+Hello::vis_ant_hilsninger( $friend );
+Hello::vis_ant_hilsninger( $other_friends[0] );
+Hello::vis_ant_hilsninger( $other_friends[1] );
+
+__END__
+
+Ferdig! Vi kunne ha f�tt penere kode ved � importere symbolene fra
+Hello.pm, men da mister vi fordelen av � vite n�yaktig hvilken pakke
+funksjonene h�rer til i.
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C25'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 25: OO-programmering</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Litt om hva som finnes</H3>
+
+Objekt-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!
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+# Vi vi pr�ver oss p� nytt, og lager en fil som vi kaller Hello.pm
+
+package Hello;   # Som f�r...
+
+sub new {   # Vanlig navn p� en konstruktor er "new" - ingen tvang!
+        my $package = shift;  # f�rste argument er alltid en referanse
+			      # til 
+        my $navn = shift;
+	my $kjonn = shift;
+
+	die "new() skal ha 2 argumenter" if @_;
+	die "$navn sitt kj�nn m� v�re 'M' eller 'K'! (ikke '$kjonn')\n"
+	    unless $kjonn =~ m/^[MK]$/;
+
+	my $person = {
+	        navn      => $navn,
+		kjonn     => $kjonn,
+		_ant_hils => 0  };
+
+	bless( $person, $package ); # Her knytter vi $person til
+				    # $package, slik at vi f�r
+				    # effekten av en klasse.
+	return $person;
+}
+
+sub hils {
+        my $self = shift;
+	my $hva = $self->{kjonn} eq "M" ? "han" : "hun";
+	my $hvem = $self->{navn};
+
+	$self->{_ant_hils}++;  # hvor mange ganger "jeg" er blitt hilst p�?
+
+	return "Nei, se! Der har vi jo $hva $hvem!\n";
+}
+
+sub vis_ant_hilsninger {
+        my $self = shift;
+	return $self->{_ant_hils};
+}
+
+sub vis_navn {
+        my $self = shift;
+	return $self->{navn};
+}
+
+sub vis_kjonn {
+        my $self = shift;
+	return $self->{kjonn};
+}
+
+1;   # S� avslutter vi med en sann verdi.
+</PRE></FONT></TD></TR></TABLE><BR>
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+#!/usr/bin/perl -w
+# Ny fil! Dette er "hils.pl"
+
+use strict;
+use diagnostics;
+
+use Hello; # Hello.pm m� v�re tilgjegelig i @INC for at dette skal
+           # fungere smertefritt.
+
+my $friend = Hello->new("Gorm", "M");
+
+my @other_friends = (
+        Hello->new("Natalija", "M"),
+	Hello->new("Remi", "M") );
+
+# Og s� hilser vi po et par venner :)
+
+print $friend->hils();
+print $other_friends[0]->hils();
+print $other_friends[1]->hils();
+print $other_friends[1]->hils();
+print $friend->hils();
+print $other_friends[1]->hils();
+print $other_friends[0]->hils();
+
+print $friend->vis_ant_hilsninger();
+print $other_friends[0]->vis_ant_hilsninger();
+print $other_friends[1]->vis_ant_hilsninger();
+
+__END__
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C26'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 26: En CGI-modul</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>CGI_Lite</H3>
+
+En lett-versjon av den (mye) kraftigere CGI-modulen i perl - denne
+passer bedre til enkle oppgaver, og er ikke s� tung for systemet.
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+#!/usr/bin/perl -wT
+#
+# Et enkelt CGI-script som returnerer data du har gitt.
+
+use strict;
+use diagnostics;
+use CGI_Lite;
+
+my $cgi = new CGI_Lite; # En annen m�te � lage et objekt p�
+
+$cgi->set_platform("Unix");
+$cgi->add_mime_type("text/html");
+
+my %form = $cgi->parse_form_data; # Hente inn data fra browser
+
+$/ = undef; # Vi vil ha alt p� en gang n�r vi leser fra en filehandle
+
+my $page = &lt;DATA&gt; # Leser fra __DATA__ nedenfor
+
+foreach my $data_key (keys %form) {
+        # Bytte ut f.eks. $NAVN med $form{NAVN}
+        $page =~ s/\$$data_key/$form{$data_key}/gm;
+}
+
+$page =~ s/\$\w+/foo/gm;
+
+print "Content-type: text/html\r\n\r\n";
+print $page;
+
+__DATA__
+&lt;HTML&gt;
+&lt;HEAD&gt;&lt;TITLE&gt;CGI_Lite-test&lt;/TITLE&gt;&lt;/HEAD&gt;
+&lt;BODY&gt;
+
+&lt;H1&gt;Hei, $NAVN&lt;/H1&gt;
+
+Du er $ALDER gammel, har jeg h�rt!
+
+&lt;HR&gt;
+
+&lt;FORM METHOD="POST" ACTION="$SCRIPT_URL"&gt;
+Navn: &lt;INPUT TYPE="text" NAME="NAVN" VALUE="$NAVN"&gt;&lt;BR&gt;
+Alder: &lt;INPUT TYPE="text" NAME="ALDER" VALUE="$ALDER"&gt;&lt;BR&gt;
+&lt;INPUT TYPE="submit"&gt;
+&lt;/FORM&gt;
+
+&lt;/BODY&gt;
+&lt;/HTML&gt;
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C27'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 27: Referanser</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Nyttige linker</H3>
+
+<UL>
+
+ <LI>Kurssidene til PVV - <A HREF='http://www.pvv.ntnu.no/kurs/'>http://www.pvv.ntnu.no/kurs/</A>
+
+</LI>
+
+ <LI>Perl.com - Hovedressursern for perl-informasjon p� nettet. Her
+kan du s�ke i dokumentasjon, f�lge diskusjoner, lese artikler, f� med
+deg perl-nyheter go mye mer - <A HREF='http://www.perl.com/'>http://www.perl.com/</A>
+
+</LI>
+
+ <LI>CPAN - "Comprehensive Perl Archive Network" er et sentralt
+samlested for perl-moduler - <A HREF='http://www.perl.com/CPAN'>http://www.perl.com/CPAN</A>
+
+</LI>
+
+ <LI>Perl Reference Topics - en meget bra oversikts-side over
+dokumentasjon - <A HREF='http://www.perl.com/reference/'>http://www.perl.com/reference/</A>
+
+</LI>
+
+ <LI>comp.lang.perl.* - Nyhetsgrupper for perl-interesserte. Et par
+ukers "lurking" p� disse kanalene er utrolig l�rerikt! -
+<A HREF='news:comp.lang.perl.misc'>news:comp.lang.perl.misc</A>
+
+</LI>
+
+ <LI>FMTEYEWTK - "Far More Than Everything You've Ever Wanted to Know
+About..." - <A HREF='http://www.perl.com/CPAN/doc/FMTEYEWTK/'>http://www.perl.com/CPAN/doc/FMTEYEWTK/</A>
+
+</LI>
+
+ <LI>"The GNU Public License" -
+<A HREF='http://www.opensource.org/licenses/gpl-license.html'>http://www.opensource.org/licenses/gpl-license.html</A>
+
+</LI>
+
+ <LI>"The Artistic License" -
+<A HREF='http://www.opensource.org/licenses/artistic-license.html'>http://www.opensource.org/licenses/artistic-license.html</A>
+
+</LI>
+
+ <LI>"How To Write Unmaintainable Code" -
+<A HREF='http://mindprod.com/unmain.html'>http://mindprod.com/unmain.html</A>
+
+</LI>
+
+</UL>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>Online dokumentasjon</H3>
+
+<UL>
+
+ <LI><CODE>perldoc</CODE> er perl sitt plattformuavhengige
+dokumentasjons-system - pr�v � kj�re <CODE>perldoc perl</CODE>!
+</LI>
+
+ <LI>perldoc
+ <UL>
+
+  <LI>perl - For � f� oversikten.
+ </LI>
+
+  <LI>perlstyle - Hvordanskrive ryddig kode.
+ </LI>
+
+  <LI>perlfaq - Mange sp�rsm�l med gode svar!
+ </LI>
+
+  <LI>perldata - Datastrukturer
+ </LI>
+
+  <LI>perlre - Regul�re uttrykk
+ </LI>
+
+  <LI>perlfunc - Funksjoner Extravaganza!
+ </LI>
+
+  <LI>perlrun - Hva kan du skrive p� kommandolinja?
+ </LI>
+
+  <LI>perltoot - Et mini-kurs i Objekt-orientert perl!
+ </LI>
+
+  <LI>perlsec - Om sikkerhet, og hva du b�r tenke p�.
+ </LI>
+
+  <LI>perlpos - Hvordan lage enkel, profesjonell inline
+ dokumentasjon.
+ </LI>
+
+  <LI>perlvar - Spesialvariabler...
+ </LI>
+
+  <LI>perltrap - Programmeringsfeller man kan g� i.
+ </LI>
+
+  <LI>perlmod - Hvordan man bruker moduler i perl.
+ </LI>
+
+ </UL>
+
+</LI>
+
+ <LI>Pr�v ogs� <CODE>perldoc -tf funksjonsnavn</CODE>!
+</LI>
+
+</UL>
+
+</P>
+
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>B&oslash;ker</H3>
+
+<UL>
+
+ <LI>"Learning Perl" - O'Reilly &amp; Associates - ISBN:
+1-56592-284-0
+</LI>
+
+ <LI>"Programming Perl" - O'Reilly &amp; Associates - ISBN:
+1-56592-149-6
+</LI>
+
+ <LI>"Perl Cookbook" - O'Reilly &amp; Associates - ISBN:
+1-56592-243-3
+</LI>
+
+ <LI>"Mastering Regular Expressions" - O'Reilly &amp; Associates -
+ISBN: 1-56592-257-3
+</LI>
+
+ <LI>"Object Oriented Perl" - Manning Publications - ISBN:
+1-88477-779-1
+</LI>
+
+</UL>
+
+</P>
+
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C28'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 28: XML::Parser og XML::RSS</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>'Mine overskrifter'</H3>
+
+Scriptet, beskrivelse av det og eksempler p� bruk kan du finne p�
+<A HREF='http://www.webreference.com/perl/tutorial/8/'>http://www.webreference.com/perl/tutorial/8/</A>
+.
+
+<BR><TABLE CLASS="perlcode" BGCOLOR='#eeeeee' WIDTH=100% BORDER=1 CELLPADDING=5>
+<TR><TD CLASS="perlcode"><FONT SIZE=-1><PRE>
+
+#!/usr/bin/perl -w
+# rss2html - converts an RSS file to HTML
+# It take one argument, either a file on the local system,
+# or an HTTP URL like http://slashdot.org/slashdot.rdf
+# by Jonathan Eisenzopf. v1.0 19990901
+# Copyright (c) 1999 internet.com Corp. All Rights Reserved.
+# See http://www.webreference.com/perl for more information
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# INCLUDES
+use strict;
+use XML::RSS;
+use LWP::Simple;
+
+# Declare variables
+my $content;
+my $file;
+
+# MAIN
+# check for command-line argument
+die "Usage: rss2html.pl (&lt;RSS file> | &lt;URL>)\n" unless @ARGV == 1;
+
+# get the command-line argument
+my $arg = shift;
+
+# create new instance of XML::RSS
+my $rss = new XML::RSS;
+
+# argument is a URL
+if ($arg=~ /http:/i) {
+    $content = get($arg);
+    die "Could not retrieve $arg" unless $content;
+    # parse the RSS content
+    $rss->parse($content);
+
+# argument is a file
+} else {
+    $file = $arg;
+    die "File \"$file\" does't exist.\n" unless -e $file;
+    # parse the RSS file
+    $rss->parsefile($file);
+}
+
+# print the HTML channel
+print_html($rss);
+
+# SUBROUTINES
+sub print_html {
+    my $rss = shift;
+    print &lt;&lt;HTML;
+&lt;TABLE BGCOLOR="#000000" BORDER="0" WIDTH="200">&lt;TR>&lt;TD>
+&lt;TABLE CELLSPACING="1" CELLPADDING="4" BGCOLOR="#FFFFFF"
+ BORDER=0 WIDTH="100%">
+  &lt;TR>
+  &lt;TD VALIGN="middle" ALIGN="center" BGCOLOR="#EEEEEE">&lt;FONT
+   COLOR="#000000" FACE="Arial,Helvetica">&lt;B>&lt;A
+   HREF="$rss->{'channel'}->{'link'}">$rss->{'channel'}->{'title'}&lt;/A>
+&lt;/B>&lt;/FONT>&lt;/TD>&lt;/TR>
+&lt;TR>&lt;TD>
+HTML
+
+    # print channel image
+    if ($rss->{'image'}->{'link'}) {
+	print &lt;&lt;HTML;
+&lt;CENTER>
+&lt;P>&lt;A HREF="$rss->{'image'}->{'link'}">&lt;IMG
+ SRC="$rss->{'image'}->{'url'}" ALT="$rss->{'image'}->{'title'}"
+ BORDER="0"
+HTML
+        print " WIDTH=\"$rss->{'image'}->{'width'}\""
+	    if $rss->{'image'}->{'width'};
+	print " HEIGHT=\"$rss->{'image'}->{'height'}\""
+	    if $rss->{'image'}->{'height'};
+	print ">&lt;/A>&lt;/CENTER>&lt;P>\n";
+    }
+
+    # print the channel items
+    foreach my $item (@{$rss->{'items'}}) {
+	next unless defined($item->{'title'})
+	            &amp;&amp; defined($item->{'link'});
+
+	print "&lt;LI>&lt;A HREF=\"$item->{'link'}\">".
+	    "$item->{'title'}&lt;/A>&lt;BR>\n";
+    }
+
+    # if there's a textinput element
+    if ($rss->{'textinput'}->{'title'}) {
+	print &lt;&lt;HTML;
+&lt;FORM METHOD="GET" ACTION="$rss->{'textinput'}->{'link'}">
+$rss->{'textinput'}->{'description'}&lt;BR> 
+&lt;INPUT TYPE="text" NAME="$rss->{'textinput'}->{'name'}">&lt;BR>
+&lt;INPUT TYPE="submit" VALUE="$rss->{'textinput'}->{'title'}">
+&lt;/FORM>
+HTML
+    }
+
+    # if there's a copyright element
+    if ($rss->{'channel'}->{'copyright'}) {
+	print &lt;&lt;HTML;
+&lt;P>&lt;SUB>$rss->{'channel'}->{'copyright'}&lt;/SUB>&lt;/P>
+HTML
+    }
+
+    print &lt;&lt;HTML;
+&lt;/TD>
+&lt;/TR>
+&lt;/TABLE>
+&lt;/TD>&lt;/TR>&lt;/TABLE>
+HTML
+}
+</PRE></FONT></TD></TR></TABLE><BR>
+
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+<A NAME='C29'><P><TABLE WIDTH=80% BORDER=0>
+<TR><TH CELLPADDING=15 COLSPAN=2 BGCOLOR='#77eeff'><BR><HR SIZE=1 NOSHADE><FONT SIZE=+2>Del 29: Annet?</FONT><BR><HR SIZE=1 NOSHADE></TR>
+<TR><TD WIDTH=100%>
+
+<P CLASS='paragraph'>
+<H3 CLASS='paragraph'>S&aring; kan man sp&oslash;rre...</H3>
+
+<CODE>perl -e 'print "Hva n�?\n";'</CODE>
+</P>
+
+</TD><TD WIDTH=50%></TD></TABLE>
+
+
+</HTML>
diff --git a/rss2html.pl b/rss2html.pl
new file mode 100644
index 0000000..431a88d
--- /dev/null
+++ b/rss2html.pl
@@ -0,0 +1,114 @@
+#!/usr/bin/perl -w
+# rss2html - converts an RSS file to HTML
+# It take one argument, either a file on the local system,
+# or an HTTP URL like http://slashdot.org/slashdot.rdf
+# by Jonathan Eisenzopf. v1.0 19990901
+# Copyright (c) 1999 internet.com Corp. All Rights Reserved.
+# See http://www.webreference.com/perl for more information
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# INCLUDES
+use strict;
+use XML::RSS;
+use LWP::Simple;
+
+# Declare variables
+my $content;
+my $file;
+
+# MAIN
+# check for command-line argument
+die "Usage: rss2html.pl (<RSS file> | <URL>)\n" unless @ARGV == 1;
+
+# get the command-line argument
+my $arg = shift;
+
+# create new instance of XML::RSS
+my $rss = new XML::RSS;
+
+# argument is a URL
+if ($arg=~ /http:/i) {
+    $content = get($arg);
+    die "Could not retrieve $arg" unless $content;
+    # parse the RSS content
+    $rss->parse($content);
+
+# argument is a file
+} else {
+    $file = $arg;
+    die "File \"$file\" does't exist.\n" unless -e $file;
+    # parse the RSS file
+    $rss->parsefile($file);
+}
+
+# print the HTML channel
+print_html($rss);
+
+# SUBROUTINES
+sub print_html {
+    my $rss = shift;
+    print <<HTML;
+<TABLE BGCOLOR="#000000" BORDER="0" WIDTH="200"><TR><TD>
+<TABLE CELLSPACING="1" CELLPADDING="4" BGCOLOR="#FFFFFF"
+ BORDER=0 WIDTH="100%">
+  <TR>
+  <TD VALIGN="middle" ALIGN="center" BGCOLOR="#EEEEEE"><FONT
+   COLOR="#000000" FACE="Arial,Helvetica"><B><A
+   HREF="$rss->{'channel'}->{'link'}">$rss->{'channel'}->{'title'}</A>
+</B></FONT></TD></TR>
+<TR><TD>
+HTML
+
+    # print channel image
+    if ($rss->{'image'}->{'link'}) {
+        print <<HTML;
+<CENTER>
+<P><A HREF="$rss->{'image'}->{'link'}"><IMG
+ SRC="$rss->{'image'}->{'url'}" ALT="$rss->{'image'}->{'title'}"
+ BORDER="0"
+HTML
+        print " WIDTH=\"$rss->{'image'}->{'width'}\""
+            if $rss->{'image'}->{'width'};
+        print " HEIGHT=\"$rss->{'image'}->{'height'}\""
+            if $rss->{'image'}->{'height'};
+        print "></A></CENTER><P>\n";
+    }
+
+    # print the channel items
+    foreach my $item (@{$rss->{'items'}}) {
+        next unless defined($item->{'title'})
+                    && defined($item->{'link'});
+
+        print "<LI><A HREF=\"$item->{'link'}\">".
+            "$item->{'title'}</A><BR>\n";
+    }
+
+    # if there's a textinput element
+    if ($rss->{'textinput'}->{'title'}) {
+        print <<HTML;
+<FORM METHOD="GET" ACTION="$rss->{'textinput'}->{'link'}">
+$rss->{'textinput'}->{'description'}<BR> 
+<INPUT TYPE="text" NAME="$rss->{'textinput'}->{'name'}"><BR>
+<INPUT TYPE="submit" VALUE="$rss->{'textinput'}->{'title'}">
+</FORM>
+HTML
+    }
+
+    # if there's a copyright element
+    if ($rss->{'channel'}->{'copyright'}) {
+        print <<HTML;
+<P><SUB>$rss->{'channel'}->{'copyright'}</SUB></P>
+HTML
+    }
+
+    print <<HTML;
+</TD>
+</TR>
+</TABLE>
+</TD></TR></TABLE>
+HTML
+}