EMZETT.
Login

Kurz: $_ ist die Standardvariable: map, grep, for und viele Funktionen nutzen sie, wenn du nichts angibst.

Teil des Kurses Perl

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

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
8

Hashes

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
4

Mengen 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 z

Merke

  • Arrays: push, pop, shift, unshift, splice, sort, reverse, map, grep
  • $_ ist die Standardvariable; $#a letzter Index
  • Hashes: $h{key}, keys, values, exists, delete; Reihenfolge nicht garantiert
  • List::Util liefert sum, 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

Weiter im Kurs

Zurück: Skalare, Zahlen und Strings

Weiter: Kontrollstrukturen

Alle Kapitel: Perl im Überblick