Tutorial : Perl : Installation und Programmierung mit CPAN-Modulen
      
Shopsoftware Shopsystem
  Home     Download     News     Kontakt     Impressum     Sitemap  

Demo-Version   
Häufige Fragen   
Module und Preise   
Wie bestellen   
Support   
AnfrageAnfrage   
TutorialsTutorials
Partnerprogramm   
Über interaktiv.net   
Leistungen   
Referenzen   
Sie sind hier  :  Startseite Support Tutorials
Perl : Installation und Programmierung mit CPAN-Modulen


Allgemeines zu Perl und Modulen
Objektorientiert oder Strukturiert
Installation von Modulen
Grundlagen
Der normale Weg der Installation
Online Installation mit dem CPAN Modul
Active Perl Module
Online Installation mit dem PPM Modul
Einige Beispiele mit erprobten Scripts
Ermitteln welche Module installiert sind
Scripte archivieren mit Archive::Tar
Eine Excel Tabelle auslesen mit Win32::OLE
Beispiele zu LWP
Größe von Verzeichnissen
Module selbst schreiben



Allgemeines zu Perl und Modulen

Perl ist eine Skript-Sprache. Das heißt: Perl ist weitestgehend unabhängig von der Plattform, ein Perl-Skript wird zur Laufzeit vom Perl-Interpreter übersetzt, wobei es dazu für die verschiedensten Plattformen unterschiedliche Perl-Interpreter gibt. Perl ist eine sehr vielseitige und mächtige Sprache mit besonderen Stärken im Bereich Textverarbeitung, Sortieren und Suchen. Das Einfügen eines Listenelements und das anschließende Sortieren dieser Liste zum Beispiel erfordert in C eine halbe Seite Quelltext, in Perl hingegen nur 2 Zeilen.

Sollen im WWW Formulare verarbeitet werden, liegt meistens ein Perl-Skript dahinter, was zur Formularauswertung aufgerufen wird. Bereits das Auslesen und Parsen von Formulareingaben erfolgt zweckmäßigerweise mit Funktionen die von Libraries oder Modulen bereitgestellt werden. Waren es anfangs Libraries die das Programmieren mit Perl vereinfachen sollten, kommen heutzutage mehr und mehr die verschiedensten Module zum Einsatz. Ein Klassiker unter den Libraries für Perl ist die cgi-lib.pl die viele praktische Funktionen zur Verfügung stellt.

Somit wird das Verwenden von Perl-Modulen deutlich: Ein Perl-Modul stellt dem Programmierer die gewünschten Funktionen zur Verfügung womit das Programmieren einfacher und übersichtlicher wird.

Perl ist eine Skript-Sprache womit man sehr schnell erfolgreich sein kann, dieser sehr zutreffende Satz stammt vom Markus Wolf und gilt insbesondere für diejenigen die bereits mit Programmiersprachen wie C, C++ oder Pascal vertraut sind. Aber auch Neueinsteiger kommen rasch zum Erfolg mit Perl.

 Nach oben  Nach unten

Objektorientiert oder Strukturiert
Nun das hängt davon ab was ein Modul bzw. eine Library bietet! Das Modul CGI.pm zum Beispiel bietet dem Programmierer beide Wege an, zum Beispiel für das Parsen von Inputfeldern aus HTML-Formularen:

Strukturierter Ansatz...
use CGI;
$name = param('name'); # direkter Zugriff auf das Inputfeld

Objektorientierter Ansatz...
use CGI;
$object = new CGI;
$name = $object->param('name'); # Zugriff auf das Inputfeld über ein Objekt

Objektorientierung heißt stark vereinfacht: Es gibt Objekte die mit Eigenschaften und Methoden ausgestattet sind. CGI.pm stellt die Funktion param() zum Parsen von Inputfeldern zur Verfügung nachdem das Modul mit use CGI eingebunden wurde. Auf diese Funktion kann entweder direkt zugegriffen werden oder über ein eigens dazu zu erstellendes Objekt. Die Funktion param() ist so gesehen eine Methode des Objektes $object. Objektorientierte Programmierung (kurz OOP genannt) ist ganz allgemein gesagt eine Abstrahierung der Strukturierten Programmierung, ein Objekt dient dazu eine bestimmte Programmieraufgabe zu modellieren. Programme zu schreiben für Windows ist zum Beispiel ohne OOP nicht mehr denkbar: Das Programmfenster ist ein Objekt mit bestimmten Eigenschaften, so ist ein Window in der Größe veränderbar und hat eine Titelleiste sowie eine Statusbar. Das grundlegene Verständnis der OOP ist eine wichtige Voraussetzung um selbst Module schreiben zu können.

 Nach oben  Nach unten

Installation von Modulen

Meistens werden Perl-Skripte auf einem Windows/NT Rechner geschrieben und auch getestet. Das Web hingegen liegt in der Mehrzahl der Fälle auf einem Rechner mit LINUX / UNIX o.ä. Betriebssystem. Die Portierung von Perl-Skripts von einem NT Rechner nach LINUX bereitet i.d.R. keine Schwierigkeiten wenn bestimmte Grundzüge (DriveLetters, Backslash) beachtet werden.

 Nach oben  Nach unten

Grundlagen
Einige Module sind bereits installiert wie z.B. das o.g. CGI.pm welches seit Perl 5 zum Standard gehört. Soll ein Modul zum Einsatz kommen was noch nicht installiert ist, so sind normalerweise Root- (Administrator-) Rechte erforderlich um die Installation vornehmen zu können. Die Installationen von Perl-Modulen unter den verschiedenen Betriebssystemen weichen auch manchmal erheblich voneinander ab und um diese Unterschiede geht es in den folgenden Abschnitten.

Das Array @INC enthält die Pfadangaben zu Libraries und Modulen die mit require, do oder use eingebunden werden, diese Verzeichnisse werden also nach den Modulen durchsucht. In einer Win32 Umgebung zeigt @INC z.B. auf die folgenden Verzeichnisse:

C:\PERL\lib
C:\PERL\site\lib
.

Standard Module befinden sich im Verzeichnis c:\perl\lib, Module die nachinstalliert werden im Verzeichnis c:\perl\site\lib. Diese Teilung hat den Hintergrund, dass bei einer Aktualisierung von Perl die Verzeichnisse mit den nachinstallierten Modulen unberührt bleiben.

Der Punkt bedeutet, dass die Library oder das Modul im aktuellen Pfad gesucht wird, d.h., ein Modul bzw. die dazugehörigen Dateien könnten auch im aktuellen Pfad cgi-bin untergebracht werden. Tatsächlich funktioniert das Einbinden von Modulen auf diese Art und Weise ganz ohne Rootrechte auch in einer LINUX Umgebung, ggf. müssen dazu auch weitere Unterverzeichnisse erstellt werden. Das Modul File steht normalerweise im folgendem Pfad:

c:\perl\lib\File

wobei File ein Verzeichnis ist in dem sich die dazugehörigen .pm Dateien befinden (z.B. Basename.pm). Eingebunden in ein Script wird das File Modul bekanntermaßen so:

use File::Basename;

Praktisch kann dieses Modul auch im cgi-bin Verzeichnis stehen, zum Beispiel so:

/home/interaktiv.net/cgi-bin/File/Basename.pm

und ohne Weiteres mit use File::Basename in ein Script eingebunden werden welches aus dem Verzeichnis cgi-bin heraus gestartet wird. Auf diese Art und Weise lassen sich wie gesagt auch andere Module einbinden. Soll ein Modul in einem gänzlich anderen Verzeichnis als in @INC angegeben installiert werden, bietet sich das Pragma use lib '/pfad/zum/modul' an.

Unter LINUX beinhaltet das @INC Array ähnliche Pfadangaben:

usr/lib/perl
usr/lib/perl/site_perl

Bezüglich des Verzeichnisses site_perl gilt hier auch das weiter oben Gesagte über /site/lib.

 Nach oben  Nach unten

Der normale Weg der Installation
Module die im CPAN Archiv zum Download angeboten werden liegen normalerweise in einer gepackten Form vor im Dateiformat *.tar.gz und müssen für die Installation nach dem Download in ein temporäres Verzeichnis ausgepackt werden. Das kann unter LINUX auf der Kommandozeile so erfolgen:

gzip -d Modul.tar.gz
bzw.
tar -xzf Modul.tar.gz

Das Programm gzip steht auf einem Windows/NT Rechner normalerweise nicht zur Verfügung, alternativ dazu kann jedoch das Freewareprogramm winzip oder die Pack/Unpack - Funktion des Windowscommanders vorteilhaft eingesetzt werden. Nach dem Auspacken der komprimierten Datei müssen die folgenden Kommandos abgesetzt werden:

perl Makefile.PL
make
make install

Dazu noch ein paar Bemerkungen: Es gibt Module die teilweise oder gänzlich als C - Quellcode vorliegen. Für deren Installation muss es also auf dem System einen C - Compiler geben, das ist auf LINUX - Maschinen normalerweise der Fall. In einer Win32 - Umgebung gibt es das Programm make nicht. Microsoft bietet jedoch auch dazu eine Alternative, siehe Quellenangaben.

 Nach oben  Nach unten

Online Installation mit dem CPAN Modul
Perl Module aus dem CPAN Archiv können auch Online installiert werden. Dazu gibt es das CPAN Modul welches zwei Modi erlaubt:
  • Interaktiver Modus
  • Batch Modus
    Um in den interaktiven Modus zu kommen muss auf der Befehlszeile das folgende Kommando abgesetzt werden:

    perl -MCPAN -e shell

    Beim ersten Aufruf dieses Kommandos (Voraussetzung: es besteht eine Verbindung zum Internet) können einige Angaben gemacht werden, wo sich z.B. die Programmdateien für nmake, tar, gzip, unzip sowie das FTP Programm oder dazu Alternativen befinden. Diese Angaben werden auf der lokalen Festplatte in der Datei c:\perl\lib\cpan\config.pm gespeichert. Sollten sich also irgendwelche Veränderungen ergeben, so kann dazu diese Datei editiert werden. Werden beim ersten Aufruf der CPAN Shell diese Angaben nicht gemacht wird eine config.pm mit Standardwerten erstellt.

    Bei einer erfolgreichen Verbindung hat der Benutzer die Eingabeaufforderung der CPAN Shell vor sich und kann das gewünschte Modul online installieren, beispielsweise so:

    install modul

    Weitere in der Shell zur Verfügung stehenden Kommandos können mit dem Fragezeichen abgerufen werden, bzw. sind in der Dokumentation beschrieben.

    Der Batch Modus erlaubt nach dem Einbinden des CPAN Module mit

    use CPAN;

    die Anwendung der Funktionen autobundle, clean, install, make, recompile und test in Perl Scripten.

     Nach oben  Nach unten

    Active Perl Module
    Für die Installation von Active Perl Modulen in einer Win32 Umgebung stellt Perl eine besondere Funktion zur Verfügung: den Perl Packages Manager, abgekürzt PPM. Die Handhabung der Datei c:\perl\bin\ppm.bat ist einfach. Das Modul als Zipfile wird nach dem Download in ein temporäres Verzeichnis beispielsweise c:\temp extrahiert.

    [x86] (Verzeichnis)
    Win32-ODBC.ppd (Datei)
    Readme (Datei)

    Zum Installieren wird in diesem Verzeichnis eine Befehlszeile aufgemacht und das folgende Kommando eingegeben:

    ppm install Win32-ODBC.ppd

    Somit werden die zum Modul gehörigen Dateien automatisch in die richtige Verzeichnisstruktur von Perl hineinkopiert.

     Nach oben  Nach unten

    Online Installation mit dem PPM Modul
    Mit der Root Library PPM können Module auch Online installiert werden. Hierzu gleich ein Beispiel:

    use PPM;
    PPM::InstallPackage("package" => 'http://www.ActiveState.com/packages/win32-odbc.ppd');

    Nachdem eine Verbindung ins Internet hergestellt wurde, dieses Script starten... und nach wenigen Augenblicken wird die erfolgreiche Installation des Win32::ODBC Moduls verkündet:

    Installing C:\Perl\site\lib\Win32\ODBC.pm
    Installing C:\Perl\site\lib\auto\Win32\ODBC\ODBC.dll
    Installing C:\Perl\site\lib\auto\Win32\ODBC\ODBC.exp
    Installing C:\Perl\site\lib\auto\Win32\ODBC\ODBC.lib
    Installing C:\Perl\htmlhelp\pkg-Win32-ODBC.chm
    Installing C:\Perl\htmlhelp\pkg-Win32-ODBC.hhc
    Writing C:\Perl\site\lib/auto/Win32-ODBC/.packlist
    Prozeß erfolgreich abgeschlossen

    Weitere Beispiele zum PPM Modul finden sich in der Online Dokumentation zu Perl.

     Nach oben  Nach unten

    Einige Beispiele mit erprobten Scripts

    In diesem Abschnitt sollen ein paar Beispielsripts vorgestellt werden in denen Module verwendet wurden.

     Nach oben  Nach unten

    Ermitteln welche Module installiert sind
    Mit diesem recht einfachen Script läßt sich leicht ermitteln, welche Module auf dem System verfügbar sind. Ein Script was die verfügbaren Module in der Form File::Basename anzeigt findet sich auf der CD zum Buch Eric Foster-Johnson, Perl Module: Effektiv programmieren mit dem CPAN-Archiv (siehe Quellenangaben).

    #!/usr/bin/perl
    # Einfaches Script was die verfügbaren Module ermittelt

    use File::Find;
    use Cwd;
    foreach $dir (@INC){
      find(\&pms, $dir);
    }

    sub pms{
      if(/\.pm/i){
        $current_dir = cwd();
        print "$current_dir $_\n";
      }
    }

     Nach oben  Nach unten

    Scripte archivieren mit Archive::Tar
    Welcher Perl Entwickler kennt sie nicht die folgende Situation: Den ganzen Tag hat er Scipte geschrieben und diese in verschiedenen Verzeichnissen abgelegt. Nun wäre es doch mehr als schön mit einem Mausklick alle Scripten die sich so auf der Festplatte befinden in eine Archivdatei zu packen. Genau diese Aufgabe erledigt das hier vorgestellte Script in dem die Module Archive::Tar und File::Find verwendet werden.

    #!/usr/bin/perl
    # Script archiviert Dateien in eine *.tar

    # Adminvorgaben
    # Startdirectory, mit Slash am Ende notieren
    $dir = "c:/";
    # Sicherungsdirectory, mit Slash am Ende notieren
    $sikdir = "c:/temp/";
    # Name des zu erstellenden Archives
    $archive = "scripte.tar";
    # Dateien der folgenden Erweiterung sollen gesichert werden
    $ext = "pl";
    # Archiv packen 1 ja 0 nein
    $compressed = 1;

    use Archive::Tar;
    $tar = Archive::Tar->new();
    use File::Find;
    $i=0;
    find(\&archive, $dir);

    sub archive{
      if(/\.$ext$/i){
        $tar->add_files($_);
        print "#";
        $i++;
      }
    }
    $tar->write($sikdir."\/".$archive.".tar", $compressed); # Archive schreiben

    print "\nEs wurden $i Dateien der Erweiterung '$ext' in das folgende Archiv gesichert: '$sikdir\/$archive.tar'\n";

    Mit diesem Script geht nichts verloren: Dateien mit gleichem Namen aus unterschiedlichen Verzeichnissen stehen brav nebeneinander im Archiv.

     Nach oben  Nach unten

    Eine Excel Tabelle auslesen mit Win32::OLE
    Wer gerne bosselt soll es probieren das folgende Script in welchem das OLE Modul Verwendung findet. Es versteht sich von selbst, dass dieses Script nur auf einer Windows Maschine funktioniert. Und noch eines sollte bedacht werden: dieses Script geht dem Server an die Ressourcen - also ran mit Rechenleistung und RAM!

    #!perl
    # Script liest eine Exceltabelle aus und zeigt den Inhalt im Browser

    use strict;
    use Win32::OLE qw(in with);
    use Win32::OLE::Const 'Microsoft Excel';
    $Win32::OLE::Warn = 3;

    my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit');

    my $Book = $Excel->Workbooks->Open('c:\links.pl\cgi-bin\tree.xls');
    my $Sheet = $Book->Worksheets(1); # entspricht Tabelle1, erstes ABlatt
    my $array = $Sheet->Range('A1:D22')->{'Value'};
    $Book->Close;

    print "content-type:text/html\n\n";
    print "<HTML><HEAD>
    <TITLE>Eine Excel Tabelle als HTML Tabelle</TITLE>
    </HEAD><BODY BGCOLOR=silver>";

    print "<h3>Eine Excel Tabelle öffnen - als HTML Tabelle ausgeben:</h3>";

    print "<table border=1 align=center cellspacing=1>\n";
    foreach my $ref_array (@$array){
      print "<tr>\n";
      foreach my $scalar (@$ref_array){
        print "<td>$scalar</td>\n";
      }
      print "</tr>\n";
    }
    print "</table>\n
    </body></html>";

     Nach oben  Nach unten

    Beispiele zu LWP
    Im Ursprung gab es eine Library libwww was auch heute noch soviel heißt wie Library for WWW access in Perl, abgekürzt LWP. LWP beinhaltet einige Module für den objektorientierten Zugang zum WWW mit Perl.

    Beispiel 1: Spiegeln einer Datei

    #!/usr/bin/perl
    # Eine WebSite spiegeln
    # Gespiegelt wird http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm
    # Mit freundlicher Genehmigung des Oreilly - Verlages Köln
    # Scriptname: mirror_cgipm.pl

    # Adminvorgaben
    # Zielverzeichnis/Datei wo die Seite hingespiegelt werden soll
    $mirror_dat = "/home/interaktiv.net/htdocs/cgipm/cgi.htm";

    # Url der Seite die gespiegelt werden soll
    $url = "http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm";

    # Ab hier gehts los
    use LWP::Simple;
    mirror($url, $mirror_dat);

    exit;
    # EOF

    Beispiel 2: Prüfen einer URL
    Solle eine URL auf Existenz geprüft werden genügt es zu prüfen ob ein Header zurückgegeben wird.

    #!/usr/bin/perl
    # einen Link auf Existenz prüfen
    $link = "http://www.interaktiv.net";
    use LWP::Simple;
    if ( head($link) ){
      print "Ok, diesen Link gibt es\n";
    }else {
      print "Unbekannter Link\n";
    }

    Beispiel 3: Eine HTML Datei downloaden

    #!/usr/bin/perl
    use LWP::Simple;
    $html_doc = get "http://www.interaktiv.net/tools/index.htm";
    print "$html_doc\n";

     Nach oben  Nach unten

    Größe von Verzeichnissen
    Die Größe eines Verzeichnisses einschließlich aller Unterverzeichnisse ermitteln? Mit dem File - Modul geht das ganz leicht:

    #!/usr/bin/perl
    # Größe von Verzeichnissen ermitteln

    # Startdirectory
    $dir = "/home/interaktiv.net/htdocs";

    use File::Find;
    use File::stat;

    find(\&dir_scan, $dir);
    $size_all = $size_all/1000;
    print "Alles zusammen macht $size_all kBytes in $i Dateien in $dir\n";

    sub dir_scan{
      $st = stat($_);
      $size = $st->size;
      $size_all += $size;
      $i++;
    }

     Nach oben  Nach unten

    Module selbst schreiben

    Nach dem Studium des hier vorgestellten Artikels haben Sie vielleicht eine Antwort auf diese Frage: Überlasse ich das Schreiben von Modulen dem Fachmann oder schreibe ich Module selbst? Letzteres ist nach einer kurzen Einarbeitungsphase und dem Studium der richtigen Quellen gar nicht weiter schwierig...
  • interAKTIVnet GmbH
    Otto-Lilienthal-Str. 36
    71034 Böblingen
    Tel. 07031-714740
    Fax 07031-714744
    info@interaktiv.net