Perl-Modul

Perl-Modul
Mechanismus der Einbindung und Verwendung von Perl-Modulen

Ein Perl-Modul ist eine separate Komponente eines Computerprogramms, das in Perl geschrieben wurde.

Ein Modul besitzt seinen Quellcode in einer Moduldatei der Endung .pm, die wiederum ein package beinhaltet, also einen eigenen Namensraum (was allerdings nicht zwingend erforderlich ist); die Struktur des Paketnamens (und damit des Namensraumnamens) spiegelt das Dateisystem wieder (sodass das Modul Net::FTP in der Datei Net/FTP.pm liegt). Darüber hinaus ist ein Perl-Modul mit Namensraum als Klasse zu verwenden, falls objektorientierte Programmierung angewandt wird (in Perl sind Namensräume äquivalent mit Klassen, müssen jedoch nicht als solche verwendet werden).

Eine Sammlung von Modulen mit zugehöriger Dokumentation, Build-Skripten etc. bilden eine Distribution. Die Perl-Community pflegt eine große Sammlung an Paketen etc. auf CPAN.

Perl als Programmiersprache erlaubt vielfältige Programmierstile. Man kann sowohl ein Modul finden, das prozedural ("herkömmlich", ähnlich wie C) geschrieben ist (z.B. Test-Simple), als auch Module mit objektorientierten Schnittstellen (z.B. XML::Parser), und sowohl das eine als auch das andere können ihre Aufgaben effizient erfüllen, da es u.a. auf den Kontext ankommt: In Verbindung mit XML ist eine objektorientierte Modulschnittstelle sehr viel sinnvoller als z.B. bei einer mathematischen Funktionsbibliothek. Module können auch als Mixin-Methoden genutzt werden oder ein Pragma sein (z.B. strict), was dann einen unmittelbaren Effekt auf das Programm hat. Außerdem können Module genutzt werden, um die Syntax der Sprache selbst zu ändern. Module haben meist nur einen Effekt auf den Sichtbarkeitsbereich, in dem sie geladen wurden (meist eine Datei).

Perl-Modulen ist es gemein, eingebettete Dokumentation als Plain Old Documentation zu besitzen. POD ist flexibel genug, Artikel, Webseiten oder gar Bücher zu schreiben (z.B. Programming Perl), im Gegensatz zu javadoc, das auf die Dokumentation von Klassen spezialisiert ist. Normalerweise folgen die Dokumentationen der Struktur einer manpage.

Der Code auf dieser Seite basiert auf Perl 5.10.0 und sollte somit auch mit Perl > 5.10.0 ausgeführt werden können. Mit beispielsweise Perl 5.6 können insbesondere die Namensraumbeispiele nicht ausgeführt werden. Es wird (Ausnahmen sind gekennzeichnet) das Benutzen des Pragmas strict vorausgesetzt, was saubereren Code zur Folge hat.

Inhaltsverzeichnis

Beispiele

Eine "Hello-World-Funktion" kann auf verschiedene Weise mit Modulen realisiert werden, wobei es nicht zwingend ist, die Funktion in ein Modul zu packen (im Gegensatz zu Java; vielmehr kann eine Funktion überall definiert und genutzt werden (in Modulen ebenfalls über Einbindung mit use) werden. Eine Hello World-Funktion sähe so aus:

sub hello() { return "Hello, World!\n"; }
print hello();

Oder aber, um einiges einfacher:

sub hello(){ print "Hello, World!\n"; }

Prozeduraler Ansatz

In hello.pm wird die Funktion hello() definiert und implementiert, die im Hauptscript main.pl ausgeführt wird.

main.pl:

#!/usr/bin/perl -w
use strict;  # Pragma strict wird genutzt, sodass eine besonders strenge Prüfung durchgeführt wird
use world::hello;   # hello.pm liegt in world/hello.pm, wobei die Basis-Verzeichnisse, also die Verzeichnis, in denen world/ liegen könnte, in einer Pfadvariable namens @INC angegeben sind,
                    # die auch das aktuelle Verzeichnis enthält
 
hallo();
hallo("Erde");

hello.pm:

use strict;
use warnings;  # äquivalent zu perl -w
 
# Zeilen mit einem "=" kennzeichnen integrierte PO-Dokumentation.
# Ein POD-Abschnitt endet mit "=cut" und kann an beliebiger Stelle stehen.
 
=head1 NAME
Hello:World -- DIE Hello-World-Implementierung.
 
=head1 ZUSAMMENFASSUNG
 
use Hello::World;
hallo();
hallo("Erde");
 
=head2 Funktionen
 
Folgende Funktionen stehen zur Verfügung:
 
=head3 hallo()
 
hallo()
hallo($etw_anderes)
 
=head1 Autor
 
Otto Normalhacker <otto@normalo.de>
 
=cut
 
sub hallo(;$)
{
    my $etw_anderes = shift @_;
    defined $etw_anderes ? print "Hello $etw_anderes !\n" : print "Hello world!\n";
}
 
return 1; # Jedes Perl-Modul muss einen wahren Wert an den Compiler liefern, sonst gibt es einen Error

Objektorientierter Ansatz

Objektorientierte Lösungen erfordern in allen Sprachen mehr Code und besitzen eine geringere Effizienz in der Ausführung. Während der Entwicklung ist die Objektorientierung allerdings oft effizienter als eine prozedurale Lösung. In Perl ist die Objektorientierung durch Referenzen (Skalare mit einer Speicheradresse) auf Code und einen Hash realisiert.

main.pl:

#!/usr/bin/perl -w
use strict;
use Hello::World; # Modul liegt in Hello/World.pm
 
my $hello = new Hello::World; # Objekt erzeugen
 
$hello->gib_begr_aus; # "Hello world" ausgeben
 
$hello = $hello->aendere_ding("galaxis"); # Zu begrüßendes Objekt in "Galaxis" ändern und das geänderte Objekt zurückspeichern
 
my $begr = $hello->begr_in_string; # Begrüßung speichern...
 
print $begr; # und ausgeben

World.pm:

package Hello::World; # Im objektorientierten Ansatz muss der Namensraum definiert sein, da in Perl jede Klasse ein Namensraum ist
 
use strict;
use warnings;
 
#
# Eventuelle
# POD-Inhalte
#
 
sub new($$) # Prototyp des Konstruktors
{
    my $class = shift @_;
    if ( exists $_[0] ) # Falls nicht anders angegeben, begrüße "world"
    {
         my $ding = $_[0];
    } else
    {
         my $ding = "world";
    }
    my $self = { ding => $ding }; # Hash-Referenz mit Daten wird erzeugt...
    bless($self, $class);  # ... mit dem Klassennamen "abgesegnet"...
    return $self; # ...und zurückgegeben
}
 
sub aendere_ding($$) # Das Ding ändern, das begrüßt wird
{
    my $self = shift @_; # Objekt annehmen
    my $ding = shift @_;
    $self->{ding} = $ding; # Daten manipulieren...
    return $self; # ...geändertes Objekt zurückgeben
}
 
sub gib_begr_aus($) # Die erzeugte Begrüßung auf STDOUT ausgeben
{
        my $self = shift @_; # Objekt wird wieder angenommen...
        print("Hello $self->{ding}!\n"); # ...und ausgegeben.
}
 
sub begr_in_string($) # Die erzeugte Begrüßung als String zurückgeben (z.B. Verwendung mit print()
{
        my $self = shift @_;
        return "Hello $self->{ding}!\n";
}

Namensräume und Geltungsbereiche

Ein Perl-Programm hat zur Laufzeit, sofern nicht anders deklariert, den Namensraum main -- eine Funktion func1() kann sowohl als func1() als auch als main::func1() gerufen werden; der Wert von $var kann sowohl über $var als auch mit $main::var herausgefunden werden. Es können jederzeit neue Namensräume deklariert und genutzt werden. Variablen, die mit my deklariert wurden verfügen über keine Namensraumzugehörigkeit, und existieren global, jedoch nur innerhalb einer Datei. Variablen, die mit our deklariert werden verfügen über eine Namensraumzugehörigkeit und existieren völlig global, also auch über Dateigrenzen hinweg, wobei sie allerdings in einer anderen Datei als der mit der Deklaration (also der einbindenden Datei) mit Scope-Resolution-Operator :: und dem Namensraum gerufen werden müssen. In ein- und derselben Datei muss eine our-Variable aus fremdem Namensraum nur dann vollqualifiziert (mit :: und Namensraum) gerufen werden, falls im aufrufenden Namensraum bereits eine our- oder my-Variable desselben Namens existiert.

package namensraum1;
my $var = "foo"; # mit my deklarierte Variablen liegen in keinem Namensraum.
                 # Ein Rufen mittels $namensraum1::var hat keinen Erfolg, mit $var jedoch überall.
our $var2 = "bar"; # our deklariert eine an den Namensraum gebundene Variable (our ist nur nötig mit strict)
 
$namensraum2::var3 = 42; # Namensraum existiert noch nicht, wird dabei aber gleich erstellt. (nur, falls strict nicht genutzt wird)
our $namensraum2::var4 = 21; # Mit und ohne strict: Fehler
my $namensraum2::var5 = 23.11; # Fehler, da my nicht namensraumgebunden ist
 
sub namensraum2::hello_w() { print("Hello World!\n"); } # Geht sowohl mit als auch ohne strict

Siehe auch

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем написать реферат

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Perl (Programmiersprache) — Perl Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle Version …   Deutsch Wikipedia

  • PERL — Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle  …   Deutsch Wikipedia

  • Perl-DBI — DBI (DataBase Interface) ist ein Perl Modul, das Perl Programmen eine einheitliche Datenbankschnittstelle zu verschiedenen Datenbankverwaltungssystemen bereitstellt und dabei eine parallele Kommunikation mit mehreren Datenbanken verschiedenen… …   Deutsch Wikipedia

  • Programmiersprache Perl — Perl Paradigmen: prozedural, modular, teilweise objektorientiert Erscheinungsjahr: 1987 Entwickler: Larry Wall, Perl Porter Aktuelle  …   Deutsch Wikipedia

  • Modul (Softwarearchitektur) — Ein Modul ist eine abgeschlossene Komponente einer Software, bestehend aus einer Folge von Verarbeitungsschritten und Datenstrukturen. Inhalt eines Moduls ist häufig eine wiederkehrende Berechnung oder Bearbeitung von Daten, die mehrfach… …   Deutsch Wikipedia

  • Modul Softwarearchitektur — Ein Modul ist eine abgeschlossene Komponente einer Software, bestehend aus einer Folge von Verarbeitungsschritten und Datenstrukturen. Inhalt eines Moduls ist häufig eine wiederkehrende Berechnung oder Bearbeitung von Daten, die mehrfach… …   Deutsch Wikipedia

  • Modul (Software) — Ein Modul (neutrum, das Modul[1]) ist eine abgeschlossene funktionale Einheit einer Software, bestehend aus einer Folge von Verarbeitungsschritten und Datenstrukturen. Inhalt eines Moduls ist häufig eine wiederkehrende Berechnung oder Bearbeitung …   Deutsch Wikipedia

  • Mod perl — ist ein freies optionales Modul für den Apache Webserver, welches einen Perl Interpreter in den Webserver integriert. Auf diese Weise können Perl Skripte für dynamische Web Inhalte ausgeführt werden, ohne dass für jede HTTP Anfrage der Perl… …   Deutsch Wikipedia

  • Programm-Modul — Ein Modul ist eine abgeschlossene Komponente einer Software, bestehend aus einer Folge von Verarbeitungsschritten und Datenstrukturen. Inhalt eines Moduls ist häufig eine wiederkehrende Berechnung oder Bearbeitung von Daten, die mehrfach… …   Deutsch Wikipedia

  • Software-Modul — Ein Modul ist eine abgeschlossene Komponente einer Software, bestehend aus einer Folge von Verarbeitungsschritten und Datenstrukturen. Inhalt eines Moduls ist häufig eine wiederkehrende Berechnung oder Bearbeitung von Daten, die mehrfach… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”