EMZETT.
Login

Kurz: Ein Skalar ($x) enthält eine Zahl, einen String oder eine Referenz. Perl wandelt je nach Operator automatisch um.

Teil des Kurses Perl

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

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

Achtung

In Perl sind 0, "0", "", undef und die leere Liste falsch; alles andere ist wahr (auch "0.0", "00").

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) und eq lt gt (Text)
  • . verkettet, x wiederholt, 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

Übungsaufgabe

Schreibe ein Skript, das einen Satz in Wörter zerlegt, jedes Wort großschreibt und wieder zusammenfügt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Einführung und erstes Skript

Weiter: Arrays und Hashes

Alle Kapitel: Perl im Überblick