EMZETT.
Login

Kurz: Module sind wiederverwendbarer Code. Mit use lädst du sie; viele gehören zum Perl-Lieferumfang:

Teil des Kurses Perl

Kapitel 9 von 11 im Kurs Perl (Abschnitt „Ökosystem“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Module benutzen

Module sind wiederverwendbarer Code. Mit use lädst du sie; viele gehören zum Perl-Lieferumfang:

use strict; use warnings;
use POSIX qw(floor ceil strftime);
use List::Util qw(sum max);
use Scalar::Util qw(looks_like_number blessed reftype);
use Time::Local qw(timegm);
use Text::Wrap qw(wrap);
use File::Basename;
use Cwd qw(getcwd);
 
print floor(3.7), " ", ceil(3.2), "\n";
print strftime("%Y-%m-%d", gmtime(timegm(0, 0, 0, 15, 2, 2025))), "\n";
print join(",", map { looks_like_number($_) ? "Zahl" : "Text" } (42, "4.5e3", "abc", "1_000")), "\n";
$Text::Wrap::columns = 20;
print wrap("", "  ", "Ein langer Satz, der umgebrochen werden soll."), "\n";
print "Arbeitsverzeichnis ist nicht leer\n" if length getcwd();

Ausgabe:

3 4
2025-03-15
Zahl,Zahl,Text,Text
Ein langer Satz,
  der umgebrochen
  werden soll.
Arbeitsverzeichnis ist nicht leer

Wichtige Kernmodule:

ModulZweck
List::Util, Scalar::UtilListen- und Skalarhelfer
Data::Dumper, StorableStrukturen ausgeben und kopieren
File::Spec, File::Temp, File::Find, File::CopyDateien
Getopt::LongKommandozeilenoptionen
POSIX, Time::Piece, Time::LocalMathematik, Zeit
JSON::PPJSON (im Kern)
Carpbessere Fehlermeldungen (croak, carp)
Test::MoreTesten
HTTP::Tinyeinfache HTTP-Anfragen
use strict; use warnings;
use JSON::PP;
use Time::Piece;
use Carp qw(croak);
 
my $json = JSON::PP->new->canonical->pretty;
my $text = $json->encode({ name => "Mia", alter => 17, hobbys => ["Lesen", "Judo"], aktiv => JSON::PP::true });
print $text;
my $daten = decode_json('{"a":[1,2,{"b":null}],"c":"text"}');
print scalar @{ $daten->{a} }, " ", $daten->{c}, " ", defined $daten->{a}[2]{b} ? "def" : "undef", "\n";
 
my $t = Time::Piece->strptime("2025-03-15", "%Y-%m-%d");
print $t->year, " ", $t->monname, " ", $t->day_of_week, " ", $t->add_months(1)->ymd, "\n";
 
sub wurzel { my $x = shift; croak "Negative Zahl: $x" if $x < 0; sqrt $x }
eval { wurzel(-4) };
print "Fehler gefangen: ", $@ =~ s/ at .*//sr, "\n";

Ausgabe:

{
   "aktiv" : true,
   "alter" : 17,
   "hobbys" : [
      "Lesen",
      "Judo"
   ],
   "name" : "Mia"
}
3 text undef
2025 Mar 6 2025-04-15
Fehler gefangen: Negative Zahl: -4

Fehlerbehandlung mit eval/die

use strict; use warnings;
sub teile { my ($a, $b) = @_; die "Division durch null\n" if $b == 0; return $a / $b }
 
my $ergebnis = eval { teile(10, 0) };
if ($@) { chomp(my $e = $@); print "Fehler: $e\n" }
print "weiter\n";
 
for my $b (2, 0) {
    my $r = eval { teile(8, $b); } // "nicht berechenbar";
    print "8/$b = $r\n";
}
 
# Objekte als Fehler
package MeinFehler { sub new { my ($c, %a) = @_; bless {%a}, $c } sub nachricht { $_[0]{nachricht} } }
eval { die MeinFehler->new(nachricht => "eigenes Fehlerobjekt") };
if (ref $@ && $@->isa('MeinFehler')) { print "Objekt: ", $@->nachricht, "\n" }
 
local $@;
print "sauber\n" unless eval { die "x\n"; 1 };

Ausgabe:

Fehler: Division durch null
weiter
8/2 = 4
8/0 = nicht berechenbar
Objekt: eigenes Fehlerobjekt
sauber

CPAN: Perls Paketarchiv

CPAN (Comprehensive Perl Archive Network, metacpan.org) hat über 200.000 Module. Installation mit cpanm (App::cpanminus) oder cpan:

cpanm Mojolicious        # Webframework
cpanm DBI DBD::SQLite    # Datenbankzugriff
cpanm --installdeps .    # Abhängigkeiten eines Projekts
perldoc List::Util       # Dokumentation eines Moduls lesen
perl -MList::Util=sum -e 'print sum(1..10)'   # Modul im Einzeiler

Für Projekte verwaltet Carton (cpanfile) die Versionen, perlbrew mehrere Perl-Versionen:

# cpanfile
requires 'Mojolicious', '>= 9.0';
requires 'DBI';
on 'test' => sub { requires 'Test::More'; };

Beliebte Module: Mojolicious und Dancer2 (Web), DBI (Datenbank), Moose/Moo (Objektorientierung), Path::Tiny (Dateien), Try::Tiny, DateTime, LWP::UserAgent (HTTP), Text::CSV.

Eigene Module schreiben

Ein Modul ist ein package in einer .pm-Datei. Der Pfad entspricht dem Namen: Mein::Modul steht in lib/Mein/Modul.pm.

use strict; use warnings;
use File::Temp qw(tempdir);
my $dir = tempdir(CLEANUP => 1);
mkdir "$dir/Mein";
open(my $f, '>', "$dir/Mein/Rechner.pm") or die;
print $f <<'MODUL';
package Mein::Rechner;
use strict; use warnings;
use Exporter 'import';
our @EXPORT_OK = qw(addiere quadrat);
our $VERSION = '1.02';
 
sub addiere { return $_[0] + $_[1] }
sub quadrat { return $_[0] ** 2 }
 
1;    # Module müssen einen wahren Wert zurückgeben
MODUL
close $f;
 
use lib ();
unshift @INC, $dir;
require Mein::Rechner;
Mein::Rechner->import(qw(addiere quadrat));
print addiere(2, 3), " ", quadrat(9), " Version ", $Mein::Rechner::VERSION, "\n";
print "geladen aus: ", ($INC{'Mein/Rechner.pm'} =~ s{.*/Mein/}{.../Mein/}r), "\n";

Ausgabe:

5 81 Version 1.02
geladen aus: .../Mein/Rechner.pm

Im Alltag: use lib 'lib'; use Mein::Rechner qw(addiere);.

Merke

  • use Modul qw(funktionen) lädt Module; viele nützliche gehören zum Kern (List::Util, POSIX, JSON::PP, Time::Piece)
  • Fehler: die und eval { } mit $@, Carp::croak für Bibliotheken
  • CPAN (cpanm, metacpan.org) mit riesiger Auswahl; perldoc Modul für Dokumentation
  • Eigene Module: package, Exporter, 1; am Ende

Übungsaufgabe

Lies mit JSON::PP eine JSON-Zeichenkette ein und gib die Schlüssel sortiert aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Referenzen und komplexe Datenstrukturen

Weiter: Objektorientierung und Tests

Alle Kapitel: Perl im Überblick