Kurz: $_ ist die Standardvariable: map, grep, for und viele Funktionen nutzen sie, wenn du nichts angibst.
Teil des Kurses Perl
Arrays
use strict; use warnings;
my @f = ("Apfel", "Birne", "Kirsche");
print "$f[0] $f[-1] $#f ", scalar(@f), "\n";
push @f, "Dattel"; # hinten anfügen
unshift @f, "Ananas"; # vorne einfügen
my $hinten = pop @f; # hinten entfernen
my $vorn = shift @f; # vorne entfernen
print "$hinten $vorn @f\n";
print "Ausschnitt: @f[0,1] | @f[1..2]\n";
splice(@f, 1, 1, "Banane", "Brombeere"); # ersetzen
print "@f\n";
my @sortiert = sort @f;
my @rueck = reverse sort @f;
print "@sortiert | @rueck\n";
my @zahlen = sort { $a <=> $b } (10, 9, 100, 1); # numerisch sortieren
print "@zahlen\n";
my @quadrate = map { $_ * $_ } 1..5;
my @gerade = grep { $_ % 2 == 0 } 1..10;
print "@quadrate | @gerade\n";
print join(", ", map { uc } @f), "\n";
my ($erstes, @rest) = (1, 2, 3, 4);
print "$erstes | @rest\n";
print "Index von Banane: ", (grep { $f[$_] eq "Banane" } 0..$#f)[0], "\n";
my @kopie = @f; # Kopie
$kopie[0] = "X";
print "$f[0] $kopie[0]\n";
print "enthalten\n" if grep { $_ eq "Dattel" } @f;
my @leer = ();
print "leer\n" unless @leer;
print scalar(@{[1..3]}), "\n";
my @mit_undef = (1, undef, 3);
print defined $mit_undef[1] ? "def" : "undef", "\n";
print "Wiederholte Liste: ", join(",", (1) x 3), "\n";Ausgabe:
Apfel Kirsche 2 3
Dattel Ananas Apfel Birne Kirsche
Ausschnitt: Apfel Birne | Birne Kirsche
Apfel Banane Brombeere Kirsche
Apfel Banane Brombeere Kirsche | Kirsche Brombeere Banane Apfel
1 9 10 100
1 4 9 16 25 | 2 4 6 8 10
APFEL, BANANE, BROMBEERE, KIRSCHE
1 | 2 3 4
Index von Banane: 1
Apfel X
leer
3
undef
Wiederholte Liste: 1,1,1$_ ist die Standardvariable: map, grep, for und viele Funktionen nutzen sie, wenn du nichts angibst.
List::Util: nützliche Listenfunktionen
use strict; use warnings;
use List::Util qw(sum sum0 min max first reduce shuffle uniq any all none);
my @z = (3, 1, 4, 1, 5, 9, 2, 6);
print sum(@z), " ", min(@z), " ", max(@z), "\n";
print join(",", uniq @z), "\n";
print first { $_ > 4 } @z;
print "\n";
print reduce { $a * $b } 1..5;
print "\n";
print( (any { $_ == 9 } @z) ? "enthält 9\n" : "nicht\n");
print( (all { $_ > 0 } @z) ? "alle positiv\n" : "nicht alle\n");
print scalar(@{[shuffle @z]}), "\n";Ausgabe:
31 1 9
3,1,4,5,9,2,6
5
120
enthält 9
alle positiv
8Hashes
Ein Hash (%h) ordnet Schlüssel Werten zu. Die Reihenfolge ist nicht garantiert: Sortiere die Schlüssel, wenn die Ausgabe stabil sein soll.
use strict; use warnings;
my %alter = (Mia => 17, Tom => 25, Zoe => 31);
$alter{Ben} = 9; # hinzufügen
$alter{Mia}++; # ändern
delete $alter{Tom};
print "Mia ist $alter{Mia}\n";
print exists $alter{Zoe} ? "Zoe existiert\n" : "keine Zoe\n";
print "Anzahl: ", scalar(keys %alter), "\n";
for my $name (sort keys %alter) {
print "$name => $alter{$name}\n";
}
for my $name (sort { $alter{$a} <=> $alter{$b} } keys %alter) { # nach Wert sortiert
print "$name ";
}
print "\n";
my @werte = sort { $a <=> $b } values %alter;
print "@werte\n";
my %invers = reverse %alter;
print join(",", map { "$_=$invers{$_}" } sort { $a <=> $b } keys %invers), "\n";
my @auswahl = @alter{qw(Mia Zoe)}; # Hash-Slice
print "@auswahl\n";
my %zaehler;
$zaehler{$_}++ for split //, "mississippi";
print join(" ", map { "$_:$zaehler{$_}" } sort keys %zaehler), "\n";
while (my ($k, $v) = each %alter) { } # each iteriert (Reihenfolge zufällig)
print "undefiniert: ", defined $alter{xyz} ? "ja" : "nein", "\n";
my %zusammen = (%alter, Neu => 1);
print scalar(keys %zusammen), "\n";Ausgabe:
Mia ist 18
Zoe existiert
Anzahl: 3
Ben => 9
Mia => 18
Zoe => 31
Ben Mia Zoe
9 18 31
9=Ben,18=Mia,31=Zoe
18 31
i:4 m:1 p:2 s:4
undefiniert: nein
4Mengen und Duplikate mit Hashes
use strict; use warnings;
my @a = qw(a b c d);
my @b = qw(c d e);
my %in_b = map { $_ => 1 } @b;
my @nur_a = grep { !$in_b{$_} } @a;
my @beide = grep { $in_b{$_} } @a;
print "nur a: @nur_a | beide: @beide\n";
my %gesehen;
my @eindeutig = grep { !$gesehen{$_}++ } qw(x y x z y);
print "@eindeutig\n";Ausgabe:
nur a: a b | beide: c d
x y zMerke
- Arrays:
push,pop,shift,unshift,splice,sort,reverse,map,grep $_ist die Standardvariable;$#aletzter Index- Hashes:
$h{key},keys,values,exists,delete; Reihenfolge nicht garantiert List::Utilliefertsum,max,first,reduce,uniq- Hash als Menge/Zähler:
$count{$_}++
Übungsaufgabe
Zähle die Wörter eines Textes mit einem Hash und gib sie nach Häufigkeit sortiert aus.
Quiz zur Selbstkontrolle
Wie sortierst du Zahlen aufsteigend?
- sort {
a <=>b } @liste (richtig)- sort @liste
- sort {
a cmpb }- @liste.sort
Ist die Reihenfolge der Schlüssel eines Hashes garantiert?
- Nein (richtig)
- Ja, alphabetisch
- Ja, in Einfügereihenfolge
- Nur bei sort
Was ist $_?
- Die Standardvariable für map, grep und for (richtig)
- Der letzte Fehler
- Das Skript
- Ein Hash
Weiter im Kurs
Zurück: Skalare, Zahlen und Strings
Weiter: Kontrollstrukturen
Alle Kapitel: Perl im Überblick