From f46dae2dea6477d7cece591ee59f1aae8c0bc6d5 Mon Sep 17 00:00:00 2001
From: Kursmester <kurs@pvv.ntnu.no>
Date: Wed, 5 Mar 2025 12:33:13 +0100
Subject: [PATCH] Recover from microbel

---
 Hello.pl      |   31 +
 Hello.pm      |   37 +
 Hello2.pl     |   32 +
 Hello2.pm     |   56 ++
 README.md     |   25 +
 navn.cgi      |   48 ++
 navn.pl       |    1 +
 perlkurs.css  |   29 +
 perlkurs.html | 1976 +++++++++++++++++++++++++++++++++++++++++++++++++
 rss2html.pl   |  114 +++
 10 files changed, 2349 insertions(+)
 create mode 100644 Hello.pl
 create mode 100644 Hello.pm
 create mode 100644 Hello2.pl
 create mode 100644 Hello2.pm
 create mode 100644 README.md
 create mode 100755 navn.cgi
 create mode 120000 navn.pl
 create mode 100644 perlkurs.css
 create mode 100644 perlkurs.html
 create mode 100644 rss2html.pl

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
+}