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();3 4 2025-03-15 Zahl,Zahl,Text,Text Ein langer Satz, der umgebrochen werden soll. Arbeitsverzeichnis ist nicht leer
Wichtige Kernmodule:
| Modul | Zweck |
|---|---|
List::Util, Scalar::Util | Listen- und Skalarhelfer |
Data::Dumper, Storable | Strukturen ausgeben und kopieren |
File::Spec, File::Temp, File::Find, File::Copy | Dateien |
Getopt::Long | Kommandozeilenoptionen |
POSIX, Time::Piece, Time::Local | Mathematik, Zeit |
JSON::PP | JSON (im Kern) |
Carp | bessere Fehlermeldungen (croak, carp) |
Test::More | Testen |
HTTP::Tiny | einfache 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";{
"aktiv" : true,
"alter" : 17,
"hobbys" : [
"Lesen",
"Judo"
],
"name" : "Mia"
}
3 text undef
2025 Mar 6 2025-04-15
Fehler gefangen: Negative Zahl: -4Fehlerbehandlung 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 };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 EinzeilerFü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";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:
dieundeval { }mit$@,Carp::croakfür Bibliotheken - CPAN (
cpanm, metacpan.org) mit riesiger Auswahl;perldoc Modulfür Dokumentation - Eigene Module:
package,Exporter,1;am Ende
Aufgabe
Lies mit JSON::PP eine JSON-Zeichenkette ein und gib die Schlüssel sortiert aus.