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 15
Syntax-Ü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|15
Position 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=1
Merke
=~ /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
Aufgabe
Extrahiere aus einem Logtext alle IP-Adressen und zähle, wie oft jede vorkommt.