Kurz: Perl hat reguläre Ausdrücke direkt in die Sprache eingebaut; fast alle anderen Sprachen und Werkzeuge haben ihre Syntax übernommen (PCRE).
Teil des Kurses Perl
Die Stärke von Perl
Perl hat reguläre Ausdrücke direkt in die Sprache eingebaut; fast alle anderen Sprachen und Werkzeuge haben ihre Syntax übernommen (PCRE).
| Operator | Zweck |
|---|---|
$s =~ /muster/ | passt? |
$s =~ s/alt/neu/ | ersetzen |
$s =~ tr/a-z/A-Z/ | Zeichen umwandeln |
@treffer = $s =~ /(\d+)/g | alle Treffer |
use strict; use warnings;
my $text = "Mia (mia\@example.com) wohnt in 10115 Berlin, Tom (tom\@test.de) in 20095 Hamburg.";
print "gefunden\n" if $text =~ /Berlin/;
print "ohne Beachtung der Schreibweise\n" if $text =~ /BERLIN/i;
if ($text =~ /(\w+)\@(\w+)\.(\w+)/) {
print "Nutzer: $1, Domain: $2, Endung: $3\n";
}
my @mails = $text =~ /[\w.]+\@[\w.]+\w/g;
print "Mails: @mails\n";
my @plz = $text =~ /\b(\d{5})\b/g;
print "PLZ: @plz\n";
my $anzahl = () = $text =~ /\d/g;
print "Ziffern: $anzahl\n";
(my $kopie = $text) =~ s/\d{5}/#####/g;
print "$kopie\n";
my $neu = $text =~ s/Berlin/Köln/r; # /r: Kopie statt ändern
print substr($neu, 0, 40), "\n";
if ("2025-03-15" =~ /^(?<jahr>\d{4})-(?<monat>\d\d)-(?<tag>\d\d)$/) {
print "Jahr $+{jahr}, Monat $+{monat}, Tag $+{tag}\n";
}Ausgabe:
gefunden
ohne Beachtung der Schreibweise
Nutzer: mia, Domain: example, Endung: com
Mails: mia@example.com tom@test.de
PLZ: 10115 20095
Ziffern: 10
Mia (mia@example.com) wohnt in ##### Berlin, Tom (tom@test.de) in ##### Hamburg.
Mia (mia@example.com) wohnt in 10115 Kö
Jahr 2025, Monat 03, Tag 15Syntax-Überblick
| Muster | Bedeutung |
|---|---|
. | beliebiges Zeichen (außer Zeilenumbruch) |
\d \w \s | Ziffer, Wortzeichen, Leerraum (Großbuchstabe = Gegenteil) |
[abc] [^abc] [a-z] | Zeichenklassen |
^ $ \b | Zeilenanfang, -ende, Wortgrenze |
* + ? {n,m} | Wiederholung (gierig); *? +? nicht gierig |
( ) (?: ) (?<name> ) | Gruppe, nicht erfassend, benannt |
a|b | Alternative |
Modifikatoren: i (Groß/klein egal), g (global), m (^/$ je Zeile), s (. trifft Zeilenumbruch), x (Leerraum und Kommentare erlaubt), e (Ersatz als Ausdruck auswerten), r (Kopie liefern).
use strict; use warnings;
my $s = "preise: 10 euro, 25 euro, 7 euro";
(my $a = $s) =~ s/(\d+)/$1 * 2/ge; # /e: Ersatz berechnen
print "$a\n";
(my $b = $s) =~ s/(\w+)/\u$1/; # \u: erster Buchstabe groß
print "$b\n";
my $gierig = "<b>fett</b> und <i>kursiv</i>";
my ($g) = $gierig =~ /<(.+)>/;
my ($n) = $gierig =~ /<(.+?)>/;
print "gierig: $g | nicht gierig: $n\n";
my $re = qr/(\d+)-(\d+)/; # vorkompilierter Ausdruck
for my $z ("3-9", "x", "100-200") {
if (my ($von, $bis) = $z =~ $re) { print "$z: $von bis $bis\n" } else { print "$z: kein Bereich\n" }
}
my $komplex = qr/
^ (\d{1,3}) \. (\d{1,3}) \. (\d{1,3}) \. (\d{1,3}) $ # IPv4
/x;
print "IP gültig\n" if "192.168.0.1" =~ $komplex;
my $mehr = "eins\nzwei\ndrei";
my @zeilen_anf = $mehr =~ /^(\w)/mg;
print "@zeilen_anf\n";
(my $upper = "hallo welt") =~ tr/a-z/A-Z/;
print "$upper\n";
my $vokale = ($upper =~ tr/AEIOU//);
print "Vokale: $vokale\n";
print join("|", split /\s*,\s*/, "a , b,c ,d"), "\n";
print join("|", "2025-03-15" =~ /(\d+)/g), "\n";Ausgabe:
preise: 20 euro, 50 euro, 14 euro
Preise: 10 euro, 25 euro, 7 euro
gierig: b>fett</b> und <i>kursiv</i | nicht gierig: b
3-9: 3 bis 9
x: kein Bereich
100-200: 100 bis 200
IP gültig
e z d
HALLO WELT
Vokale: 3
a|b|c|d
2025|03|15Position und Schleifen über Treffer
use strict; use warnings;
my $text = "a1b22c333";
while ($text =~ /(\d+)/g) {
printf "Treffer %s an Position %d\n", $1, pos($text) - length($1);
}
print "Vor: $`|Treffer: $&|Nach: $'\n" if "Hallo Welt" =~ /o W/;
my %worte;
$worte{lc $1}++ while "Der der DER Hund" =~ /(\w+)/g;
print join(", ", map { "$_=$worte{$_}" } sort keys %worte), "\n";Ausgabe:
Treffer 1 an Position 1
Treffer 22 an Position 3
Treffer 333 an Position 6
Vor: Hall|Treffer: o W|Nach: elt
der=3, hund=1Merke
=~ /muster/prüft,s///ersetzt,tr///wandelt Zeichen,qr//kompiliert- Klammern fangen Treffer in
$1,$2oder%+(benannt) - Modifikatoren:
i g m s x e r - Gierig vs. nicht gierig:
.+vs..+? @x = $s =~ /(...)/gliefert alle Treffer
Übungsaufgabe
Extrahiere aus einem Logtext alle IP-Adressen und zähle, wie oft jede vorkommt.
Quiz zur Selbstkontrolle
Was macht der Modifikator /g?
- Findet alle Treffer (global) (richtig)
- Ignoriert Groß-/Kleinschreibung
- Macht den Ausdruck gierig
- Gruppiert
Wie erreichst du den ersten gefangenen Treffer?
- $1 (richtig)
- $0
- @1
- %1
Was bewirkt s/alt/neu/r?
- Liefert eine Kopie mit Ersetzung, ohne das Original zu ändern (richtig)
- Ersetzt rückwärts
- Löscht den Text
- Ersetzt nur das letzte Vorkommen
Weiter im Kurs
Zurück: Subroutinen
Weiter: Dateien, Verzeichnisse und Ein-/Ausgabe
Alle Kapitel: Perl im Überblick