Perl

Ursprung / Anwendung

  • Perl ist aus den Unix Tools Sed/Awk entstanden.
  • Ist ursprünglich eine Skriptsprache für Unix. Mittlerweile gibt es aber Portierungen für fast jede Plattform.
  • Perl ist Opensource und kostenlos.
  • Perl ist eigentlich eine nicht objektorientierte Sprache, seit Version 5 kann aber auch objektorientiert programmiert werden:
  • -> Eine Klasse ist dann nichts weiter als ein Package, dessen Funktionen als Methoden fungieren.
  • Programmiersprache erster Wahl für CGI Programme

    Andere Anwendungsmöglichkeiten ausserhalb des Webs:

  • Shellskripte unter Unix
  • Konvertierungsskripte
  • Installationsskripte etc

    Einführung

    Das obligatorische Hello World Programm:
    #!/usr/bin/perl
    print "Content-type: text/html\n\n"; # header ausgeben
    print "Hello world\n";
    

    Es gibt in Perl nur Zeilenkommentare. Diese werden mit # eingeleitet.
    Die erste Zeile muss immer den Pfad zum Perlinterpreter enthalten.
    Meist #!/usr/bin/perl, auf dem rummelplatz aber zB /client/bin/perl.

    Variablen

    Normale Variablen werden mit einem Dollarzeichen ($) am Anfang benutzt.

  • nicht typisiert
  • lokale Variablen mit "my" einleiten
  • keine generelle Unterscheidung zwischen Zahlen und Strings
  • Unterstützung für Listen (Arrays), und Hashes

    $variable1=5;
    $variable2="5";
    print $variable2+5 ergibt 10.

    Strings

    Strings zusammenfügen durch ".":
    $s1="test";
    $s2="string";
    $s3=$s1 . $s2; # ergibt "teststring"

    Zeichenketten einfach wiederholen durch x Operator:
    "test" x 3; # ergibt "testtesttest"

    Listen / Arrays


    mit @ Zeichen:
        @liste = (1,2,3);
        
        # das gleiche wie = ("String1","String2","String3");
        @liste = qw(String1, String2, String3);     
        
        # füllt Liste mit Buchstaben von a bis z
        @liste = (a..z);                            
        
        # liste2 wird nach liste1 kopiert
        @liste1=@liste2;                            
        
        # die Anzahl der Elemente in liste2 wird in $anz gespeichert. 
        $anz=@liste2;                               
    

    Zugriff auf eine Liste:

        # falls $liste noch nicht existiert wird eine angelegt mit 6 Elementen
        $liste[5]=1;            
        
        # hängt $element an das ende der Liste an
        push($element,@liste);  
        
        # entfernt letztes Element und gibt es zurück
        $element=pop(@liste);   
        
        # entfernt erstes Element und gibt es zurück. (meist bei Subroutinen)
        $element=shift(@liste); 
    

    Hashes


    mit % Zeichen:
    %hash = (
    	 apfel => "gruen", 
    	 birne => "gelb"
    	);
    Zugriff auf Hash erfolgt mit: $hash{'key'}='wert'; oder nur $hash{wert}
      # hash2 wird nach hash1 kopiert
      %hash1=%hash2;                    
      
      # dreht hash um, Werte werden Keys, Keys werden Werte 
      %rev_hash1 = reverse %hash1; 	    
    

    Besondere Variablen in Perl


    $_ = aktueller Wert in einer Schleife oder anderen Operation
    @_ = Array der übergebenen Werte an eine Methode
    $$ = ProzessNr
    $$var= Inhalt des Zeigers der in $var gespeichert ist

    Schleifen / Verzweigungen


    For/Foreach Schleife

    wie in C

      for ($i=0;$i<10;$i++) {
      	print $i;
      }
      
    Gibt die Zahlen in der Liste aus
      @zahlen=(1..9);
      for(@zahlen){
      	print; # entspricht print $_;
      }
      # ergibt gleiche Ausgabe wie oben:
      print @zahlen;
      
      foreach $var (@liste){ 
          # mach was mit $var 
       } 
    

    hash ausgeben:

    foreach $key (keys %hashvar){ 
    	print $hashvar{$key}; 
    } 

    if/else/unless

    if($var){ 
    # mach was
    }
    elsif ($var2){ # kein Schreibfehler, wirklich ohne "e" ;-)
    # mach was
    }
    else {
    # else block
    }

    Statt if(! $var) kann man auch unless($var) benutzen.

     

    Vergleichsoperatoren

    Unterscheidung zwischen Strings und Zahlen.
    Bei Stringvergleichen wird der Ascii Wert verglichen.
    Zahlen Strings Bedeutung
    > gt greater than, größer als
    >= ge greater than or equal, größer oder gleich
    < lt less than, kleiner als
    <= le less than or equal, kleiner gleich
    == eq Equal, gleich
    != ne Not equal, ungleich

    Reguläre Ausdrücke

    Wichtige Eigenschaft von Perl ist die direkte Unterstützung von regulären Ausdrücken:
    Bedeutung Konstrukt Äquivalente Darstellung Negiert Äquivalente neg. Darstellung
    Ziffer \d [0-9] \D [^0-9]
    Zeichen \w [a-zA-Z0-9_] \W [^a-zA-Z0-9_]
    'Whitespace' Zeichen \s [ \r\t\n\f]
    \S [^ \r\t\n\f]

    ^ entspricht Zeilenanfang (außerhalb von [ ] )
    $ entspricht Zeilenende (außerhalb von [ ] )


    Durch Klammern einzelner Ausdrücke kann nachher mit $1, $2 usw auf die "gematchten" Zeichen zugriffen werden.

    Anwendung von regulären Ausdrücken

    if ($var=~/^[a-z]+$/) {
    # variable enthält nur Kleinbuchstaben und zwar mind einen
    }
    Suchen / Ersetzen

      $var=~ s/alt/neu/; # ersetzt alt durch neu 
      $var=~ s/Hugo/Fritz/; #ersetzt Hugo durch Fritz

    Ersetzen mit tr

      # ersetzt alle Kleinbuchstaben durch Grossbuchstaben
      $var=~tr/a-z/A-Z/; 
      # ersetzt a durch b und b durch a
      $var=~tr/ab/ba/; 
      

    Anwendung von ()

      $test = "das ist ein test";
    $test=~ s/(\w+)/<$1>/g; # $test enthält jetzt "<das> <ist> <ein> <test>"

    Files


        #Einlesen
    open(FILE,"<filename"); # zum lesen öffnen open(FILE,">>filename"); # Daten anhängen oder file erzeugen

    Einfaches Beispiel um eine Liste einzulesen:
    Dateiinhalt test.txt:

       1::2::3::4::5::6
       eins::zwei::drei::vier::fuenf::sechs 
    Perl Programm:
      #/!usr/bin/perl
      open(FILE,"<test.txt");
      @inhalt=<FILE>;
      close(FILE);
      @liste1=split(/::/,$inhalt[0]);
      @liste2=split(/::/,$inhalt[1]);
      

    Subroutinen in Perl

    Muss vorher nicht deklariert werden.
    Aufruf mit funktion(param1,param2);
      
      sub funktion { 
        # shift entfernt erstes Element aus einer Liste (in dem fall @_)
        $param1=shift;  
        $param2=shift;
        return wert; # auch return (wert1,wert2,wert3) möglich
      } 
      

    Module

    Für Perl gibt es tausende fertige Module für jeden erdenklichen Zweck. Riesen Archiv unter www.cpan.org.

    Aufruf mit use
    zB: use Date::Calc
    Man kann auch eigene Module mit use 'module.pl' oder mit "use modul" wenn modul .pm Endung hat

    Aufruf von Shell Commands / Programmen

    Ganz einfach durch Backticks

     $ausgabe_des_programms = `programm -parameter`;

    Auswerten von Formdaten

  • über Modul CGI.pm
      use CGI qw(param);
      $parameter = param("name");
  • oder selber programmieren: Beispiel mit Übergabe eines Parameters (?name=test)
  • Session Unterstützung

  • nicht vorhanden.
  • muss alles "von Hand" programmiert werden
  • Realisierung meist über URL-Rewritting (und/oder Cookies)

    Beispiel: URL-Rewritting:
    Anhängen einer Session ID an jeden Link.
    Session ID zusammensetzen aus der Prozessnummer ($$) und der Zeit in Millisekunden (time()) und evtl der IP Adresse.

    Datenbankunterstützung

    Durch das (externe) Modul: DBI

    Anwendung am Beispiel einer Oracle Datenbank
      #!/usr/bin/perl -w
      #
      # ch04/connect/ex1: Connects to an Oracle database.
      
      use DBI;            # Load the DBI module
      
      ### Perform the connection using the Oracle driver
      my $dbh = DBI->connect( "dbi:Oracle:archaeo", "username", "password" )
        or die "Can't connect to Oracle database: $DBI::errstr\n";
      exit;
    

    Beispiele

  • Environment Variablen ausgeben & Source Codes des Skripts
  • Bilder Top10 Beispiel
  • Erweitere Perl Möglichkeiten: ePerl & embPerl

    Erweiterungsmodule zum Apache: Perl Interpreter wird direkt in den Apache integriert
    Perl wird direkt in die HTML Files eingebettet (über konfigurierbare Tags)

    <? ... perl-code(); .... !>

    ePerl stellt ausser Start und Endtags keine weitere Funktionalität zur Verfügung
    embPerl bietet zusätzliche Pseudo-HTML-Kommandos an

    Beide sind nicht besonders weit verbreitet. Wenn man Perl verwendet, dann meist Classic Perl oder Perl in Kombination mit FastCGI.

    -> weiter (PHP)