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
Aufgabe
Schreibe FizzBuzz für 1 bis 30 in Perl.