Uppsala universitet
Språkteknologiprogrammet
Dokumenthantering, vt 2002
Leif-Jöran Olsson

Föreläsning 5: Lagring

Innehåll

  1. Lagring i Perl
  2. Några nyttiga funktioner och tips
  3. Modul-exempel

1 Lagring i Perl

Tidigare har vi ju gjort omdirigering av standardströmmar på OS-nivå för att ge Perl något att arbeta med eller ta hand om resultatet av något som ett program har utfört. Lagring direkt i Perl sker genom att man öppnar, skriver och sen stänger filer respektive öppnar läser och stänger filer. Detta ger större kontroll över vad som läses från respektive skrivs till filer av de program och processer som hanterar filerna.

Felhantering bör man ha i sina program och när man öppnar filer är det särskilt viktigt. Det är ju oftast ingen idé att fortsätta om en fil saknas eller inte går att skriva till.
	  open(INFIL, "<mina_data.lst") || die "Filen gick inte att öppna";
	  alternativt
	  open(INFIL, "<mina_data.lst") || die "Ajaj! $!";
	
$! innehåller aktuellt felnummer. I det här fallet:
	   Filen eller katalogen finns inte at läsfil-fel.perl line 6.
	

Större kontroll över vad som skrivs får man med printf (använder sprintf). Några exempel: Använd dock print i de fall det går.


2 Några nyttiga funktioner och tips

Här kommer lite mer blandat användbart.

Matrisen @ARGV och funktionen shift

Matrisen @ARGV innehåller de kommandoradsargument som gavs till skriptet. I följande exempel tre argument:

       $> ./mitt.perl argument1 argument2 argument3
     
Funktionen shift används för att få första värdet och matrisens innehåll skiftas framåt (mot början). Självklart är det inte bara @ARGV som kan skiftas utan alla matriser kan ges som argument.
	   $argument = shift(@ARGV);
	   print "Argument: $argument\n";
	   print "innehållet i \@ARGV är efter en skiftning '@ARGV'.\n"; 
	
Ovanstående kommandorad och Perl-snutt ger resultatet:
	  Argument: argument1
	  innehållet i @ARGV är efter en skiftning 'argument2 argument3'.
	

Funktioners argument finns i standardmatrisen (@_).

         $max = max(2, 3, 1);
	 sub max {
	   my (@tal) = @_;
	   #Anta att första talet är störst till att börja med.
	   my $storst = $tal[0];
	   #Annat sätt att kolla att listan inte är tom.
	   if ($#tal >= 0) {
	     foreach $element (@tal) {
	       $storst = $element if ($element > $storst);
	     }
	   }
	   return $storst;
         }
       

Funktionen use

Funktionen use används för att importera funktionalitet från moduler, säga att en viss Perl-version krävs eller för att ange direktiv.

Abstraktion

Användning av funktioner gör att abstraktionsnivån ökar, vilket ger ett överskådligare program. Räckvidd (scope) för variabler är något som hjälper dig i abstraktionsarbetet. Eftersom variabler är globala om inte annat anges, så bör my användas för at göra dem privata och begränsa räckvidden till det block de definierades i. local används för temporära variabler definierade i moduler/paket.

Funktioner anropas med funktionsnamnet och eventuella argument. Om inte parenteser används måste & prefigeras. Följande funktionsanrop är alltså ekvivlenta:

Funktioners argument ges som värde (call-by-value). Om de ska användas som referenser (call-by-reference) måste referesoperatorn \ (tidigare användes *) prefigeras till argumentet (bra för matriser och associativa arrayer):
  printHeader(\@values);

[Annat om abstraktion.]


3 Modul-exempel

Det lönar sig oftast att titta på CPAN (Comprehensive Perl Archive Network) om det är något du undrar över om det finns implementerat som en Perl-modul redan. Lokal spegling finns här <http://ftp.sunet.se/pub/lang/perl/CPAN/>. Enkelt att installera. Istort sett görs det med ett kommando:

perl -MCPAN -e `install Modulnamn`
.

CGI.pm

Common Gateway Interface (CGI) är ett sätt för programmeringsspråk att prata med webbservrar. I Perl finns alltså redan en modul för detta.

Exempel:


Senast ändrad av Leif-Jöran Olsson 2002-03-18 23.12