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:
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:
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:
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:
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
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...
|