Skalare
Ein Skalar ($x) enthält eine Zahl, einen String oder eine Referenz. Perl wandelt je nach Operator automatisch um.
use strict; use warnings;
my $a = 10;
my $b = "5";
print $a + $b, "\n"; # numerisch: 15
print $a . $b, "\n"; # Textverkettung: 105
print "10" == 10.0 ? "gleich\n" : "ungleich\n";
print "abc" lt "abd" ? "kleiner\n" : "größer\n";
print 7 / 2, " ", int(7 / 2), " ", 7 % 3, " ", 2 ** 10, " ", -7 % 3, "\n";
print 10 <=> 5, " ", "a" cmp "b", "\n";
my $i = 5; $i++; $i += 10; $i *= 2;
print "$i\n";
print 0.1 + 0.2 == 0.3 ? "gleich\n" : "ungleich (Gleitkomma)\n";
print abs(-3), " ", sqrt(16), " ", int(3.9), " ", sprintf("%.2f", 3.14159), "\n";
print 1_000_000 + 0x1F + 0b101 + 0o17 + 017, "\n";Ausgabe
15 105 gleich kleiner 3.5 3 1 1024 2 1 -1 32 ungleich (Gleitkomma) 3 4 3 3.14 1000066
Es gibt zwei Vergleichssätze: numerisch (== != < > <=>) und für Text (eq ne lt gt cmp). Wer sie verwechselt, bekommt Fehler ("abc" == "xyz" ist wahr, weil beide als 0 zählen!).
Strings
use strict; use warnings;
my $s = "Hallo Welt";
print length($s), " ", uc($s), " ", lc($s), " ", ucfirst(lc("PERL")), " ", lcfirst("ABC"), "\n";
print substr($s, 0, 5), "|", substr($s, -4), "|", index($s, "Welt"), "|", rindex($s, "l"), "\n";
print reverse($s) . "\n"; # der Punkt erzwingt Skalarkontext
print scalar reverse($s), "\n";
print "ab" x 3, "|", "-" x 10, "\n"; # Wiederholung
print join("-", 1..5), "\n";
print join(",", split(/,/, "a,b,c")), "\n";
my @w = split ' ', " viele Wörter hier ";
print scalar(@w), " Wörter: @w\n";
(my $kopie = $s) =~ s/Welt/Perl/;
print "$kopie\n";
print "Ergebnis: ${\ ($s . '!')}\n";
my $t = " getrimmt ";
$t =~ s/^\s+|\s+$//g;
print "[$t]\n";
print "Wert: @{[ 6 * 7 ]}\n"; # Ausdruck in String
print sprintf("%5s|%-5s|%05d|%.1f|%x|%b|%e", "ab", "cd", 42, 2.55, 255, 5, 1234.5), "\n";
print ord("A"), " ", chr(66), "\n";
chomp(my $zeile = "Text\n"); # entfernt Zeilenumbruch
print "[$zeile]\n";
my $w = "wort";
$w .= "e";
print "$w\n";
print "wahr\n" if "0.0"; # "0.0" ist wahr, "0" falsch
print "leer ist falsch\n" unless "";Ausgabe
10 HALLO WELT hallo welt Perl aBC Hallo|Welt|6|8 tleW ollaH tleW ollaH ababab|---------- 1-2-3-4-5 a,b,c 3 Wörter: viele Wörter hier Hallo Perl Ergebnis: Hallo Welt! [getrimmt] Wert: 42 ab|cd |00042|2.5|ff|101|1.234500e+03 65 B [Text] worte wahr leer ist falsch
here-docs und Zitieroperatoren
use strict; use warnings;
my $name = "Mia";
print <<"ENDE";
Hallo $name,
dies ist ein mehrzeiliger Text.
ENDE
print <<'ROH';
Hier wird $name nicht ersetzt.
ROH
print q(einfach 'zitiert' $name), "\n"; # wie '...'
print qq(doppelt "zitiert" $name), "\n"; # wie "..."
my @w = qw(rot grün blau); # Liste ohne Anführungszeichen
print "@w\n";Ausgabe
Hallo Mia, dies ist ein mehrzeiliger Text. Hier wird $name nicht ersetzt. einfach 'zitiert' $name doppelt "zitiert" Mia rot grün blau
undef und defined
use strict; use warnings;
my $x;
print defined($x) ? "definiert\n" : "undef\n";
$x = 0;
print defined($x) ? "definiert (0)\n" : "undef\n";
my $y = $x // "Standard"; # // = defined-or
my $z;
$z //= "gesetzt";
my $w = $x || "Ersatz"; # || ersetzt auch 0
print "$y $z $w\n";
undef $x;
print defined($x) ? "ja\n" : "wieder undef\n";Ausgabe
undef definiert (0) 0 gesetzt Ersatz wieder undef
Merke
- Skalare: Zahl, String, Referenz; automatische Umwandlung
- Zwei Vergleichssätze:
== < >(Zahlen) undeq lt gt(Text) .verkettet,xwiederholt,length,substr,index,uc,lc,sprintf,join,split- Falsch:
0,"0","",undef;//für Standardwerte - Heredocs und
q(),qq(),qw()für Strings und Listen
Aufgabe
Schreibe ein Skript, das einen Satz in Wörter zerlegt, jedes Wort großschreibt und wieder zusammenfügt.