EMZETT.
Login

Kurz: Bedingungen stehen in Klammern, der Block immer in geschweiften Klammern:

Teil des Kurses Perl

Kapitel 4 von 11 im Kurs Perl. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

if, elsif, else, unless

Bedingungen stehen in Klammern, der Block immer in geschweiften Klammern:

use strict; use warnings;
my $punkte = 78;
if ($punkte >= 90) {
    print "sehr gut\n";
} elsif ($punkte >= 75) {
    print "gut\n";
} else {
    print "weiter üben\n";
}
print "bestanden\n" if $punkte >= 50;          # Modifikator
print "nicht perfekt\n" unless $punkte == 100;
my $text = $punkte >= 50 ? "ja" : "nein";       # ternär
print "$text\n";
print "beides\n" if $punkte > 50 and $punkte < 100;
print "oder\n" if $punkte < 0 or $punkte > 70;
print "nicht\n" if not $punkte == 0;
my $name = undef;
my $anzeige = $name // "unbekannt";
print "$anzeige\n";

Ausgabe:

gut
bestanden
nicht perfekt
ja
beides
oder
nicht
unbekannt

Es gibt kein switch im Kern; üblich sind if/elsif, Hash-Dispatch oder for als Schalter:

use strict; use warnings;
my %aktion = (
    plus  => sub { $_[0] + $_[1] },
    minus => sub { $_[0] - $_[1] },
    mal   => sub { $_[0] * $_[1] },
);
for my $op (qw(plus minus mal geteilt)) {
    if (my $f = $aktion{$op}) {
        print "$op: ", $f->(12, 4), "\n";
    } else {
        print "$op: unbekannt\n";
    }
}
for my $x ("apfel", "kiwi") {     # for als Schalter
    for ($x) {
        if (/^a/) { print "$x beginnt mit a\n"; last; }
        print "$x: anderes\n";
    }
}

Ausgabe:

plus: 16
minus: 8
mal: 48
geteilt: unbekannt
apfel beginnt mit a
kiwi: anderes

Schleifen

use strict; use warnings;
for my $i (1..3) { print "i=$i "; }
print "\n";
for (my $j = 10; $j > 0; $j -= 4) { print "j=$j "; }
print "\n";
foreach my $f (qw(rot grün blau)) { print "$f "; }
print "\n";
 
my $n = 3;
while ($n > 0) { print $n--, " "; }
print "\n";
my $k = 0;
until ($k >= 3) { print $k++, " "; }
print "\n";
do { print "mindestens einmal\n" } while (0);
 
print "$_ " for 1..5;
print "\n";
my @liste = (10, 20, 30);
for my $i (0..$#liste) { print "$i:$liste[$i] "; }
print "\n";
for my $x (@liste) { $x *= 2 }            # ändert das Array direkt
print "@liste\n";
 
OUTER: for my $i (1..3) {
    for my $j (1..3) {
        next OUTER if $j == 2;
        last OUTER if $i == 3;
        print "$i$j ";
    }
}
print "\n";
 
for my $z (1..10) {
    next if $z % 2;       # überspringen
    last if $z > 6;       # abbrechen
    print "$z ";
}
print "\n";
my $versuche = 0;
{
    $versuche++;
    redo if $versuche < 3;        # Block wiederholen
}
print "Versuche: $versuche\n";

Ausgabe:

i=1 i=2 i=3
j=10 j=6 j=2
rot grün blau
3 2 1
0 1 2
mindestens einmal
1 2 3 4 5
0:10 1:20 2:30
20 40 60
11 21
2 4 6
Versuche: 3

Eingaben lesen

use strict; use warnings;
# Von STDIN: while (my $zeile = <STDIN>) { chomp $zeile; ... }
# Hier simuliert mit einer Datei im Speicher:
my $daten = "Mia 17\nTom 25\n\nZoe 31\n";
open(my $fh, '<', \$daten) or die "Kann nicht öffnen: $!";
while (my $zeile = <$fh>) {
    chomp $zeile;
    next unless length $zeile;           # Leerzeilen überspringen
    my ($name, $alter) = split ' ', $zeile;
    printf "%-4s %3d  (Zeile %d)\n", $name, $alter, $.;
}
close($fh);

Ausgabe:

Mia   17  (Zeile 1)
Tom   25  (Zeile 2)
Zoe   31  (Zeile 4)

Merke

  • if/elsif/else, unless, Modifikatoren (print ... if ...); Klammern um Bedingungen, {} immer
  • Kein switch: Hash von Funktionen oder if-Ketten
  • Schleifen: for, foreach, while, until; next, last, redo, Labels
  • while (<FH>) liest zeilenweise, $. ist die Zeilennummer

Übungsaufgabe

Schreibe FizzBuzz für 1 bis 30 in Perl.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Arrays und Hashes

Weiter: Subroutinen

Alle Kapitel: Perl im Überblick