TOC PREV Übungen NEXT INDEX

2 Skalare Daten

Was sind skalare Daten?

Im Deutschen, wie auch in vielen anderen gesprochenen Sprachen, unterscheiden wir zwischen Singular und Plural. Da die Computersprache Perl von einem menschlichen Sprachwissenschaftler entwickelt wurde, verhält sie sich ganz ähnlich. Als Faustregel können Sie sich merken: Ist in Perl von einem einzelnen Etwas die Regel, so handelt es sich um einen skalaren Wert bzw. einen Skalar.1

Ein Skalar ist der einfachste Datentyp, den Perl kennt. Die meisten Skalare sind entweder eine Zahl (wie 255 oder 3,25 20 ) oder ein String (eine Zeichenkette, z. B. Hallo2 oder das Grundgesetz). Im Gegensatz zu anderen Sprachen sind bei Perl Zahlen und Strings fast beliebig austauschbar.

Auf einen skalaren Wert kann man Operatoren anwenden (wie etwa Plus oder Aneinanderhängen) und erhält normalerweise als Ergebnis auch wieder einen skalaren Wert. Skalare Werte können in skalaren Variablen gespeichert werden. Skalare Werte können aus Dateien und von Eingabegeräten gelesen sowie auch wieder ausgegeben werden.

Zahlen

Auch wenn Skalare sowohl eine Zahl als auch eine Zeichenkette sein können, ist es sinnvoll, sie erst einmal getrennt zu betrachten. Zuerst nehmen wir uns die Zahlen vor und wenden uns dann den Zeichenketten zu.

Alle Zahlen besitzen intern das gleiche Format

Wie Sie in den nächsten Absätzen sehen werden, ist es möglich, sowohl ganze Zahlen (Integer, wie etwa 255 oder 2001) als auch Fließkommazahlen (floating-point, reelle Zahlen, wie z. B. 3,14159 oder 1,35 mal 1025) anzugeben.3 Intern arbeitet Perl jedoch mit Fließkommawerten doppelter Genauigkeit.4 Dies bedeutet, daß Perl intern keine ganzen Zahlen kennt - eine ganzzahlige Konstante im Programm wird intern wie die entsprechende Fließkommazahl behandelt.5 Vermutlich fällt Ihnen diese Umwandlung auch gar nicht weiter auf (oder stört Sie nicht weiter). Jedenfalls sollten Sie nicht weiter nach speziellen Operatoren für ganzzahlige Werte suchen - es gibt sie nämlich nicht.6

Fließkomma-Literale

Ein Literal ist die zeichengetreue Darstellung von Daten im Quellcode des Perl-Programms und nicht das Ergebnis einer Berechnung oder einer Eingabe/Ausgabe-Operation.

Die Fließkomma-Literale von Perl sollten Ihnen bereits bekannt vorkommen. Es sind sowohl Zahlen mit als auch ohne Dezimalpunkt erlaubt (einschließlich eines vorangestellten Plus oder Minus). Auch das Anhängen einer Zehnerpotenz (Exponentialdarstellung) mittels der E-Notation ist erlaubt. Zum Beispiel:

 1.25
 255.000
 255.0
 7.25e45  # 7,25 mal 10 hoch 45 (eine ziemlich große Zahl)
 -6.5e24  # minus 6,5 mal 10 hoch 24
          # (eine ziemlich große negative Zahl)
 -12e-24  # minus 12 mal 10 hoch minus 24
          # (eine sehr kleine negative Zahl)
 -1.2E-23 # eine andere Art, das gleiche zu sagen
          # - E kann auch ein Großbuchstabe sein.

Ganzzahlige Literale

Ganzzahlige Literale sind genauso unkompliziert:

0
2001
-40
255
61298040283768

Die letzte Zahl ist etwas schwer zu lesen. Perl erlaubt es der Klarheit halber, innerhalb von ganzzahligen Literalen Unterstriche zu benutzen. Dadurch können wir die Zahl auch folgendermaßen schreiben:

61_298_040_283_768

Hierbei handelt es sich um den gleichen Wert; er sieht für uns Menschen nur anders aus. Vielleicht meinen Sie, man hätte hier besser Dezimalpunkte verwendet. Diese werden in Perl jedoch bereits für einen wichtigeren Zweck verwendet, wie wir im nächsten Kapitel sehen werden.

Nichtdezimale ganzzahlige Literale

Wie in anderen Programmiersprachen auch erlaubt Perl Ihnen, Zahlen nicht nur in der dezimalen (zur Basis 10) Schreibweise anzugeben. Oktalen (zur Basis 8) Literalen wird hierfür eine 0 vorangestellt, hexadezimale (zur Basis 16) Literale beginnen mit 0x und binäre (zur Basis 2) mit 0b.7 Die Hexadezimalzahlen A bis F (oder auch a bis f) bezeichnen die konventionellen Zahlenwerte von 10 bis 15. Zum Beispiel:

 0377       # 377 oktal, das gleiche wie 255 dezimal
 0xff       # FF hexadezimal, auch 255 dezimal
 0b11111111 # auch 255 dezimal (verfügbar ab Version 5.6)

Auch wenn diese Werte für uns Menschen sehr unterschiedlich aussehen, bedeuten sie für Perl doch die gleiche Zahl. Für Perl macht es keinen Unterschied, ob Sie 0xFF oder 255.000 schreiben. Wählen Sie daher die Darstellung, die für Sie und den »Programmierer, der nach Ihnen kommt«, den Wartungsprogrammierer, am besten geeignet ist. (Hiermit meinen wir den armen Kerl, der den Rest seines Lebens damit verbringt herauszufinden, was Sie wohl mit Ihrem Code gemeint haben. Meistens handelt es sich hierbei um Sie selbst, und Sie wissen nicht mehr, warum Sie vor drei Monaten getan haben, was Sie getan haben.)

Nichtdezimale Literale, die länger als vier Zeichen sind, können schwer zu lesen sein. Aus diesem Grund sind bei Perl beginnend mit der Version 5.6 auch hier Unterstriche erlaubt, um Literale leichter lesbar zu machen:

0x1377_0b77
0x50_65_72_7C

Numerische Operatoren

In Perl stehen die typischen Operatoren für Addition, Subtraktion, Multiplikation, Division usw. zur Verfügung. Zum Beispiel:

 2 + 3      # 2 plus 3, oder 5
 5.1 - 2.4  # 5,1 minus 2,4, oder 2,7
 3 * 12     # 3 mal 12 = 36
 14 / 2     # 14 geteilt durch 2, oder 7
 10.2 / 0.3 # 10,2 geteilt durch 0,3, oder 34
 10 / 3     # grundsätzlich Fließkomma-Division, also etwa 3,3333333...

Perl unterstützt außerdem den Modulo-Operator (%). Der Wert des Ausdrucks 10 % 3 ist der Rest, der übrigbleibt, wenn 10 durch 3 geteilt wird, also 1. Beide Werte werden vorher auf ihren ganzzahligen Wert reduziert - 10.5 % 3.2 wird also als 10 % 3 berechnet.8

Zusätzlich gibt es in Perl den Potenzierungsoperator, der Ihnen möglicherweise aus FORTRAN bekannt ist (und den sich viele auch für Pascal und C wünschen). Der Operator besteht aus einem doppelten Sternchen (Asterisk), wie etwa 2**3, was 2 hoch 3 oder 8 entspricht.9

Darüber hinaus gibt es noch eine Reihe weiterer numerischer Operatoren, die wir vorstellen werden, wenn wir sie brauchen.

Strings

Unter einem String (bzw. einer Zeichenkette) versteht man eine Aneinanderreihung von Zeichen (wie etwa Hallo). Strings können beliebige Kombinationen verschiedener Zeichen enthalten.10

Der kürzestmögliche String enthält überhaupt keine Zeichen. Der längste mögliche String füllt Ihren gesamten Hauptspeicher (auch wenn Sie nicht viel damit anfangen können). Dies steht im Einvernehmen mit dem Prinzip der »Grenzenlosigkeit«, dem Perl bei jeder Gelegenheit folgt. Typische Strings sind Folgen aus druckbaren Zeichen mit Buchstaben und Zahlen im Bereich zwischen ASCII 32 und ASCII 126. Da in einem String beliebige Zeichen vorkommen dürfen, ist es möglich, auch aus rohen Binärdaten Strings zu erzeugen, diese zu durchsuchen und zu bearbeiten - etwas, womit viele andere Hilfsprogramme (Utilities) große Schwierigkeiten hätten. Zum Beispiel können Sie eine Grafikdatei oder ein kompiliertes Programm in einen Perl-String einlesen, diesen verändern und das Ergebnis wieder herausschreiben.

Wie für Zahlen gibt es auch für Strings eine Möglichkeit der literalen Darstellung, die einen String in Ihrem Programm verkörpert. String-Literale kommen in zwei Geschmacksrichtungen vor: als Strings in einfachen Anführungszeichen und als Strings in doppelten Anführungszeichen.11

Strings in einfachen Anführungszeichen

Ein »Single-quoted String« ist eine Zeichenkette, die von einfachen Anführungszeichen umschlossen wird. Hierbei sind die Anführungszeichen nicht Teil des Strings - sie zeigen Perl vielmehr den Anfang und das Ende des Strings an. Jedes Zeichen, das kein einfaches Anführungszeichen oder ein Backslash ist, steht hier für sich selbst (hierzu gehört auch ein Zeilenumbruch, falls der String sich über mehrere Zeilen erstreckt). Wenn Sie einen Backslash benötigen, schreiben Sie einfach zwei Backslashes hintereinander; benötigen Sie ein literales einfaches Anführungszeichen, so schreiben Sie einen Backslash, gefolgt von einem einfachen Anführungszeichen. Mit anderen Worten:

 'Fred'    # Die vier Zeichen: F, r, e und d
 'Barney'  # Diese sechs Zeichen
 ''        # Der Nullstring (keine Zeichen)
 'Ein \' kann Ihren String frueher beenden, als Sie denken.'
 'Das letzte Zeichen dieses Strings ist ein Backslash: \\'
 'Hallo\n' # Hallo, gefolgt von einem Backslash, gefolgt von einem n
 'Hallo
 Welt!'    # Hallo, Zeilenumbruch, Welt! (insgesamt 11 Zeichen)
 '\'\\'    # Ein einfaches Anführungszeichen, gefolgt von Backslash

Die Zeichenfolge \n innerhalb eines Strings in einfachen Anführungszeichen wird nicht als Newline-Zeichen interpretiert, sondern als ein Backslash, gefolgt von einem n. Sonderbedeutungen haben hier nur der doppelte Backslash (\\) und ein Backslash, gefolgt von einem einfachen Anführungszeichen (\').

Strings in doppelten Anführungszeichen

Strings in doppelten Anführungszeichen (»Double-quoted Strings«) verhalten sich in Perl so ähnlich wie Strings in anderen Programmiersprachen. Auch hier handelt es sich um eine Folge von Zeichen, die diesmal allerdings von doppelten Anführungszeichen umgeben sind. Jetzt kann der Backslash seine ganze Stärke zeigen, um bestimmte Kontrollzeichen oder auch jedes beliebige Zeichen in oktaler oder hexadezimaler Form darzustellen. Hier sehen Sie ein paar Strings in doppelten Anführungszeichen:

 "Barney"        # das gleiche wie 'Barney'
 "Hallo Welt\n"  # Hallo Welt und ein Newline-Zeichen
 "Das letzte Zeichen ist ein doppeltes Anführungszeichen: \""
 "Kaffee\tTee"   # Ein Kaffee, ein Tabulator und ein Tee

Der String "Barney" hat für Perl die gleiche Bedeutung wie 'Barney'. Das funktioniert genauso wie die Behandlung von Zahlen, bei denen 0377 nur eine andere Schreibweise für 255 ist. In Perl können Sie ein Literal auf die Art schreiben, die für Sie am sinnvollsten ist. Wenn Sie Backslash-Escape-Zeichen (wie etwa \n für ein Newline-Zeichen) benutzen wollen, müssen Sie allerdings doppelte Anführungszeichen verwenden.

Der Backslash kann vor einer Reihe verschiedener Zeichen stehen, die dadurch ihre Bedeutung ändern. Die fast vollständige12 Liste von Backslash-Escapes für Strings in doppelten Anführungszeichen finden Sie in Tabelle 2-1.
Tabelle 2-1: Escapes für Strings in doppelten Anführungszeichen 
Ausdruck
Bedeutung
\n
Newline-Zeichen, Zeilenumbruch
\r
Return, Wagenrücklauf
\t
Tabulator
\f
Formfeed, Seitenvorschub
\b
Backspace, Rückschritt
\a
Tonsignal
\e
Escape (ASCII-Escape-Zeichen)
\007
Jeder oktale ASCII-Wert (hier: 007 = Tonsignal)
\x7f
Jeder hexadezimale ASCII-Wert (hier: 7f = DEL, Löschzeichen)
\cC
Jedes »Control«-Zeichen (hier: Ctrl-C)
\\
Backslash
\"
doppeltes Anführungszeichen
\l
den folgenden Buchstaben klein schreiben
\L
alle folgenden Buchstaben bis zum nächsten \E klein schreiben
\u
den folgenden Buchstaben groß schreiben
\U
alle folgenden Buchstaben bis zum nächsten \E groß schreiben
\Q
alle nicht-alphanumerischen Zeichen bis zum nächsten \E mit einem Backslash schützen
\E
hebt die Wirkung von \L, \U oder \Q wieder auf

Ein weiteres Merkmal von Strings in doppelten Anführungszeichen ist die Variablen-Interpolation. Das bedeutet, daß bestimmte Variablennamen innerhalb des Strings durch den enthaltenen Wert ersetzt werden, wenn der String benutzt wird. Wir wissen bisher noch nicht, wie eine Variable aussieht, daher werden wir später in diesem Kapitel darauf zurückkommen.

Operatoren für Strings

Strings können mit dem Operator . aneinandergehängt werden (ja, dies ist ein einzelner Punkt). Hierdurch werden die Strings genausowenig verändert, wie das Pluszeichen in 2+3 die 2 oder 3 ändert. Der resultierende (längere) String kann dann weiterverarbeitet werden oder in einer Variablen gespeichert werden. Zum Beispiel:

 "Hallo" . "Welt"       # das gleiche wie "HalloWelt"
 "Hallo" . ' ' . "Welt" # das gleiche wie 'Hallo Welt'
 'Hallo Welt' . "\n"    # das gleiche wie "Hallo Welt\n"

Beachten Sie: Das Aneinanderhängen muß mit dem .-Operator ausdrücklich angefordert werden. Sie können also nicht wie bei anderen Sprachen die zwei Strings einfach hintereinanderstellen.

Ein weiterer Operator für Strings ist beispielsweise der Wiederholungsoperator, der aus einem einzelnen klein geschriebenen x besteht. Dieser Operator fertigt so viele Kopien seines linken Operanden (eines Strings) an, wie durch den rechten Operanden (eine Zahl) angegeben wird, und hängt diese aneinander. Zum Beispiel:

 "Fred" x 3     	# ergibt "FredFredFred"
 "Barney" x (4+1)	# ergibt "Barney" x 5, oder
         	        # "BarneyBarneyBarneyBarneyBarney"
 5 x 4          	# ist eigentlich "5" x 4, also "5555"

Das letzte Beispiel sollten wir uns noch einmal genauer ansehen. Der Wiederholungsoperator benötigt als linken Operanden einen String, daher wird die Ziffer 5 hier in den aus einem Zeichen bestehenden String "5" umgewandelt. (Dies geschieht anhand von Regeln, die wir später im Detail erläutern werden.) Das Ergebnis wird nun viermal kopiert, woraus sich der String 5555 ergibt. Hätten wir die Reihenfolge der Operanden umgekehrt, also 4 x 5 geschrieben, so hätten wir statt dessen fünf Kopien des Strings 4 angefertigt. Das Ergebnis wäre also 44444. Wir sehen also, daß die Operanden nicht einfach gegeneinander ausgetauscht werden können.

Der Zähler für die anzufertigenden Kopien wird vor der Operation auf einen ganzzahligen Wert reduziert (4,8 wird zu 4) bevor er benutzt wird. Ist der Wert für die anzufertigenden Kopien kleiner als eins, so wird ein leerer String (ohne Länge) verwendet.

Automatische Umwandlung zwischen Zahlen und Strings

In den meisten Fällen wandelt Perl je nach Bedarf Zahlen in Strings (und umgekehrt) um. Aber woher weiß Perl, was gerade gebraucht wird? Das hängt jeweils davon ab, welcher Operator auf den skalaren Wert angewendet wird. Erwartet der Operator eine Zahl (wie etwa + das tut), so sieht Perl diesen Wert als Zahl an. Erwartet ein Operator (wie etwa .) hingegen einen String, so wird Perl diesen Wert auch als String ansehen. Sie brauchen sich also keine Sorgen um den Unterschied zwischen Zahlen und Strings zu machen; benutzen Sie einfach die richtigen Operatoren, und Perl übernimmt den Rest für Sie.

Wird etwa ein String verwendet, wo ein Operator eine Zahl erwartet (z. B. bei einer Multiplikation) wandelt Perl den String automatisch in ihre numerische Entsprechung um, als wäre sie als Fließkommazahl eingegeben worden.13 Die Operation "12" * "3" ergibt das Ergebnis 36. Nachgestellte Zeichen, die keine Zahlen sind, und vorangestellte Leerzeichen werden ignoriert. "12fred34" * "   3" ergibt also ebenfalls 36, ohne daß Perl sich darüber beklagen würde.14 Ist im Extremfall etwas überhaupt keine Zahl, so wird statt dessen null verwendet. Das wäre etwa der Fall, wenn Sie versuchten, den String "fred" als Zahl zu benutzen.

Wird statt dessen ein String gebraucht, wird dieser in den der Zahl entsprechenden String umgewandelt (beispielsweise beim Anhängen). Wenn Sie beispielsweise das Ergebnis von 5 multipliziert mit 715 an den String Z anhängen wollen, können Sie dies folgendermaßen tun:

"Z" . 5 * 7 # das gleiche wie "Z" . 35, oder "Z35"

Mit anderen Worten: Sie brauchen sich (meistens) keine Gedanken darüber machen, ob Sie es mit einer Zahl oder einem String zu tun haben. Perl übernimmt die notwendigen Konvertierungen für Sie.16 Sollten Sie sich in diesem Zusammenhang Sorgen um die Effizienz solcher Operationen machen, seien Sie beruhigt. Perl »erinnert« sich in der Regel an das Ergebnis einer Konvertierung, so daß diese nur einmal durchgeführt wird.

Eingebaute Warnungen

Sie können Perl anweisen, Sie zu warnen, wenn es auf verdächtige Vorgänge in Ihrem Programm stößt. Die Warnungen für Ihr Programm schalten Sie ein, indem Sie auf der Kommandozeile die -w-Option benutzen:

$ perl -w mein_programm

Alternativ können Sie die Warnungen für jeden Programmablauf einschalten, indem Sie diese in der #!-Zeile anfordern:

#!/usr/bin/perl -w

Dies funktioniert sogar auf Nicht-Unix-Systemen. Da hier der Pfad zu Perl nicht wichtig ist, schreiben Sie hier traditionsgemäß:

#!perl -w

Wenn Sie nun versuchen, '12fred34' anstelle einer Zahl zu benutzen, warnt Perl Sie:

Argument "12fred34" isn't numeric

Sicher - diese Warnungen sind in der Regel für Programmierer und nicht für die Benutzer gedacht. Wenn aber nicht einmal der Programmierer die Warnungen sieht, macht das die Sache nicht besser. Warnungen ändern das Verhalten Ihres Programms nur insofern, als daß Ihr Programm hin und wieder meckert. Erhalten Sie eine Warnung, die Sie nicht verstehen, schlagen Sie in der perldiag-Manpage nach.

Die Warnungen können sich von einer Perl-Version zur nächsten ändern. Wird Ihr gut ausbalanciertes Programm, das bisher ohne Murren lief, mit einer neueren (oder älteren) Perl-Version verwendet, kann es passieren, daß plötzlich Warnungen auftreten. Um Ihnen bei diesem Problem zu helfen, ist es möglich, ab der Perl-Version 5.6 sogenannte lexikalische Warnungen zu benutzen. Diese Warnungen können in bestimmten Teilen Ihres Codes ein- und ausgeschaltet werden. Dies ermöglicht eine größere Kontrolle als der für sich stehende -w-Switch. In der perllexwarn-Manpage finden sich weitere Information zur Verwendung dieser Warnungen.

Sollte uns im Verlaufe dieses Buches eine Situation begegnen, in der Perl Sie vor Ihrem Fehler warnen kann, werden wir entsprechend darauf hinweisen. Hierbei sollten Sie sich jedoch nicht darauf verlassen, daß Text oder Verhalten der Warnungen bei zukünftigen Perl-Versionen unverändert bleiben.

Skalare Variablen

Eine Variable ist ein Name für einen Behälter, der einen oder mehrere Werte enthalten kann.17 Der Name der Variablen bleibt das gesamte Programm über gleich. Der enthaltene Wert kann sich jedoch während der Ausführung immer wieder ändern.

Eine skalare Variable enthält einen einzelnen skalaren Wert. Der Name einer skalaren Variablen beginnt mit einem Dollar-Zeichen ($), gefolgt von einem Perl-Identifier. Dieser besteht aus einem Buchstaben oder Unterstrich, eventuell gefolgt von mehreren Buchstaben, Ziffern oder Unterstrichen. Anders gesagt kann ein Variablenname aus alphanumerischen Zeichen und Unterstrichen bestehen, darf aber nicht mit einer Ziffer beginnen. Es wird zwischen Groß- und Kleinschreibung unterschieden. Das bedeutet: Die Variable $Fred unterscheidet sich von der Variablen $fred. Sämtliche Buchstaben, Ziffern und Unterstriche sind hierbei von Bedeutung, daher gilt:

$sehr_lange_variable_nummer_1

unterscheidet sich von:

$sehr_lange_variable_nummer_2

Skalare Variablen werden in Perl immer mit einem vorangestellten $ bezeichnet. Auf der Shell würden Sie $ benutzen, um einen Wert auszugeben, für eine Zuweisung würden Sie $ jedoch weglassen. In awk oder C lassen Sie das Dollarzeichen ganz weg. Wenn Sie sich nun sehr viel zwischen verschiedenen Sprachen bewegen, kann es leicht passieren, daß Sie die falschen Sachen eingeben. Davon gehen wir aus. (Die meisten Perl-Programmierer würden Ihnen in diesem Fall empfehlen aufzuhören, Shell-, awk- oder C-Programme zu schreiben. Leider geht das aber nicht immer.)

Einen guten Variablennamen auswählen

In der Regel sollten Sie Variablennamen so wählen, daß sie etwas über den Zweck der Variablen aussagen. $r ist wahrscheinlich nicht ganz so aussagekräftig wie $zeilen_laenge. Eine Variable, die nur in zwei oder drei aufeinanderfolgenden Zeilen Ihres Programms benutzt wird, kann man schon einmal $n nennen; wird eine Variable jedoch im gesamten Programm benutzt, sollten Sie ihr einen verständlicheren Namen geben.

Ebenso können richtig plazierte Unterstriche das Lesen und Verstehen eines Variablennamens erleichtern, besonders dann, wenn der Programmierer, der Ihre Programme pflegen soll, einen anderen sprachlichen Hintergrund hat als Sie. So ist beispielsweise der Name $flachbett_scanner besser geeignet als $flachbettscanner, da sich Letzteres auch durchaus als $flach_bettscanner deuten lassen könnte. Bedeutet $stopid nun $sto_pid (»store process ID« also Prozeß-ID speichern) oder $stop_id (die ID für irgend etwas, das ge»stop«t werden soll), oder handelt es sich bloß um einen stopiden Rechtschreibfehler?

Meistens werden die Variablennamen in diesem Buch (und auch sonst) klein geschrieben. In einigen Sonderfällen schreiben wir den ersten Buchstaben eines Namens groß. Besteht ein Variablenname komplett aus Großbuchstaben (wie etwa $ARGV), so handelt es sich meistens um etwas Besonderes. (Sie können allerdings leicht in einen handfesten Streit geraten, wenn Sie in einer $unterstriche_sind_super-gegen-$GrosschreibungMussSein-Diskussion Partei ergreifen. Seien Sie also vorsichtig.)

Perl macht es nichts aus, ob Sie nun passende oder unpassende Variablennamen wählen. Sie könnten die drei wichtigsten Variablen in Ihrem Programm auch $OOO000OOO, $OO00OO00 und $O0O0O0O0O nennen, und Perl würde das überhaupt nicht stören. Fragen Sie uns in diesem Fall aber bitte nicht um Hilfe bei der Pflege Ihres Codes.

Skalare Zuweisung

Die häufigste Operation mit skalaren Variablen ist die Zuweisung. Hierdurch wird der Variablen ein Wert zugewiesen. Der Zuweisungsoperator ist in Perl wie auch in vielen anderen Sprachen das Gleichheitszeichen (=). Der Variablenname steht hierbei links vom Gleichheitszeichen; der Wert, der zugewiesen werden soll, steht rechts. Zum Beispiel:

 $fred = 17;            # $fred den Wert 17 zuweisen
 $barney = 'Hallo';     # $barney den String 'Hallo' zuweisen
 $barney = $fred + 3;   # $barney den gegenwärtigen Wert von 
                        # $fred plus 3 zuweisen (20)
 $barney = $barney * 2; # $barney ist nun $barney mal 2 (40)

In der letzten Zeile benutzen wir die Variable $barney zweimal: Einmal, um ihren Wert auszulesen (rechts vom Gleichheitszeichen), und einmal, um anzugeben, wo der berechnete Ausdruck gespeichert werden soll (links vom Gleichheitszeichen). Dies ist in Ordnung, sicher und sogar recht gebräuchlich. Es ist sogar so gebräuchlich, daß wir diese Schreibweise noch weiter abkürzen können, wie wir im folgenden Abschnitt sehen werden.

Binäre Zuweisung

Ausdrücke wie $fred = $fred + 5 (bei denen auf beiden Seiten einer Zuweisung die gleiche Variable erscheint) kommen so oft vor, daß Perl (wie auch C und Java) eine Abkürzung dafür bereithält - den Operator für binäre Zuweisung. Fast alle binären18 Operatoren, die einen Wert berechnen, besitzen eine entsprechende Form der binären Zuweisung, bei der dem Operator ein Gleichheitszeichen angehängt wird. Die folgenden zwei Zeilen sind beispielsweise gleichbedeutend:

 $fred = $fred + 5; # ohne den Operator für binäre Zuweisung
 $fred += 5;        # mit dem Operator für binäre Zuweisung

Auch dies ist gleichbedeutend:

$barney = $barney * 3;
$barney *= 3;

In beiden Fällen bewirkt der Operator eine Änderung der existierenden Variablen, anstatt sie einfach mit dem Ergebnis eines neues Ausdrucks zu überschreiben.

Ein weiterer gebräuchlicher Zuweisungsoperator ist der Operator für das Aneinanderhängen von Zeichenketten ( . ); damit haben wir einen Anhängeoperator ( .= ):

 $str = $str . " "; 	# ein Leerzeichen an $str anhängen
 $str .= " ";       	# das gleiche mit dem Zuweisungsoperator                   

Fast alle binären Operatoren funktionieren auf diese Art. Der Potenzierungsoperator wird als **= geschrieben. $fred **= 3 bedeutet also »potenziere die Zahl in $fred mit 3 und schreibe das Ergebnis zurück nach $fred«.

Ausgaben mit print

In der Regel sollte Ihr Programm irgendeine Art von Ausgabe erzeugen; ansonsten könnte jemand denken, das Programm wurde gar nicht ausgeführt. Ausgaben erzeugen Sie mit Hilfe des print( )-Operators. Es wird ein skalarer Wert übergeben, und print schreibt diesen ohne weitere Bearbeitung in die Standardausgabe. Sofern Sie nicht irgend etwas Seltsames gemacht haben, ist Ihr Terminal die Standardausgabe.

Zum Beispiel:

 print "Hallo Welt\n"; # Ausgabe von Hallo Welt, 
                       # gefolgt von einem Newline-Zeichen
 print "Die Antwort ist ";
 print 6 * 7;
 print ".\n";

Sie können print auch mehrere durch Kommata getrennte Werte übergeben.

print "Die Antwort ist ", 6 * 7, ".\n";

Hier handelt es sich eigentlich um eine Liste. Da wir aber bis jetzt noch nicht über Listen gesprochen haben, werden wir auch erst später auf die Details eingehen.

Interpolation von Skalarvariablen in Strings

Steht ein String in doppelten Anführungszeichen, findet neben den Tests auf Backslash-Escapes die sogenannte Variablen-Interpolation19 statt. Das bedeutet, daß der Name einer skalaren Variablen20 innerhalb des Strings durch den gegenwärtigen Wert dieser Variablen ersetzt wird. Zum Beispiel:

 $essen  = "Brontosaurier-Steak";
 $barney = "Fred aß ein $essen";    # $barney ist jetzt "Fred aß ein
                                    # Brontosaurier-Steak"
 $barney = 'Fred aß ein ' . $essen; # Eine andere Art, das gleiche 
                                    # zu sagen

Wie Sie sehen, ist es auch möglich, das gleiche Ergebnis auch ohne doppelte Anführungszeichen zu bekommen. Meistens ist deren Verwendung jedoch wesentlich bequemer.

Wurde einer skalaren Variablen bisher kein Wert zugewiesen21, so wird statt dessen eine leere Zeichenkette verwendet.

$barney = "Fred aß ein $stueck_fleisch"; # $barney jetzt "Fred aß ein"

Wenn Sie nur eine einzelne Variable haben, brauchen Sie sich um die Interpolation nicht zu kümmern:

 print "$fred"; # unnötige doppelte Anführungszeichen
 print $fred;   # besserer Stil

Es ist nicht falsch, bei einer einzelnen Variablen doppelte Anführungszeichen zu verwenden, allerdings werden die anderen Programmierer hinter Ihrem Rücken vermutlich über Sie lachen.22

Die Variableninterpolation wird auch Interpolation in doppelten Anführungszeichen genannt, da sie bei der Verwendung von doppelten (und nicht bei einzelnen) Anführungszeichen stattfindet. Wie wir später noch sehen werden, gibt es außerdem noch andere Formen von Strings, bei denen Variablen ebenfalls interpoliert werden.

Wenn Sie in einem String in doppelten Anführungszeichen tatsächlich ein Dollarzeichen benötigen, stellen Sie diesem einen Backslash voran. Hierdurch wird die Sonderbedeutung des Dollarzeichens aufgehoben.

 $fred = 'Hallo';
 print "Der Name lautet \$fred.\n";    # gibt ein Dollarzeichen aus
 print 'Der Name lautet $fred' . "\n"; # hat die gleiche Wirkung

Perl sucht in einem String nach dem längsten möglichen Variablennamen, den es finden kann. Dies kann zu Problemen führen, wenn direkt auf die Variable literaler Text folgen soll, der mit einem Buchstaben, einer Zahl oder einem Unterstrich beginnt.23 Während Perl nach Variablennamen sucht, sieht es diese Zeichen als Bestandteil des vorangegangenen Namens an, was Sie in den meisten Fällen eher nicht wollen. Zum Glück existieren für diesen Fall Zeichen, mit denen Sie, ähnlich wie auf der Shell, den Variablennamen vom restlichen Text trennen können. Umschließen Sie den Namen der Variablen einfach mit geschweiften Klammern. Alternativ dazu können Sie den Rest Ihres Strings auch mittels des Anhängen-Operators mit dem vorderen Teil verbinden.

 $was = "Brontosaurier-Steak";
 $n = 3;
 print "Fred aß $n $wass.\n";       # Keine Steaks, sondern der
                                    #  Wert von $wass
 print "Fred aß $n ${was}s.\n";     # Jetzt wird $was benutzt
 print "Fred aß $n $was" . "s.\n";  # eine andere Art, das gleiche
                                    #  zu tun
 print 'Fred aß ' . $n . ' ' . $was . "s.\n"; # eine besonders
                                              # aufwendige Methode

Präzedenz und Assoziativität der Operatoren

Die Präzedenz von Operatoren legt fest, welche Operation in einer komplexen Gruppe von Operationen als erste ausgeführt wird. Nehmen wir zum Beispiel den Ausdruck 2+3*4. Wird hier zuerst die Addition ausgeführt oder die Multiplikation? Würden wir zuerst die Addition ausführen, wäre das Ergebnis 5*4, also 20. Würden wir dagegen zuerst die Multiplikation ausführen (so wie wir es aus dem Mathematikunterricht kennen), bekämen wir 2+12, also 14. Zum Glück wählt Perl in solchen Fällen die gängige mathematische Definition und führt daher zuerst die Multiplikation aus. Man kann also sagen, die Multiplikation hat Vorrang vor der Addition oder eine höhere Präzedenz.

Sie können sich über die voreingestellte Präzedenz hinwegsetzen, indem Sie runde Klammern verwenden. Hierdurch wird der Ausdruck in den runden Klammern zuerst vollständig berechnet, bevor der Operator außerhalb der Klammern Anwendung findet (genau wie Sie es im Mathematikunterricht gelernt haben). Wenn wir also wollen, daß die Addition tatsächlich vor der Multiplikation ausgeführt wird, können wir sagen: (2+3)*4, was 20 ergibt. Wenn wir nun aber wollen, daß die Multiplikation vor der Addition ausgeführt wird, können wir dies mit einem Paar dekorativer, aber unnötiger runder Klammern tun: 2+(3*4).

Während die Präzedenz bei einfacher Addition und Multiplikation noch recht intuitiv ist, bekommen wir Probleme, wenn wir es beispielsweise mit dem Aneinanderhängen von Strings und Potenzierung zu tun haben. Der richtige Weg, dieses Problem in den Griff zu bekommen, ist die Verwendung der einzig wahren und durch nichts zu ersetzenden Tabelle für die Präzedenz von Perl-Operatoren (siehe Tabelle 2-2).24 (Beachten Sie, daß einige der Operatoren bis jetzt noch nicht vorgestellt wurden und unter Umständen in diesem Buch überhaupt nicht auftauchen. Lassen Sie sich jedoch nicht davon abhalten, diese in der perlop-Manpage nachzuschlagen.)
Tabelle 2-2: Assoziativität und Vorrang (Präzedenz) von Operatoren (in absteigender Reihenfolge) 
Assoziativität
Operatoren
links
runde Klammern und Listen-Operatoren
links
-> (Dereferenzierung)
keine
++ -- (Autoinkrement, Autodekrement)
rechts
** (Potenzierung)
rechts
\ ! ~ + - (Referenzierung, logisches NICHT, bitweises NICHT, unäres Plus, unäres Minus)
links
=~ !~ (Muster paßt, Muster paßt nicht)
links
* / % x (Multiplikation, Division, Modulo-Operator, Strings-Wiederholung)
links
+ - . (binäre Operatoren Plus, Minus, Aneinanderhängen)
links
<< >>
keine
benannte unäre Operatoren (-X-Dateitests, rand)
keine
< <= > >= lt le gt ge (die »Ungleich«-Operatoren)
keine
== != <=> eq ne cmp (die »Gleich«-Operatoren)
links
& (bitweises UND)
links
| ^ (bitweises ODER, bitweises Exklusiv-ODER)
links
&& (logisches UND)
links
|| (logisches ODER)
keine
.. ... (nicht inklusiver und inklusiver Bereich)
rechts
?: (ternäres if-then-else)
rechts
= += -= .= (sowie ähnliche Zuweisungsoperatoren (binär und unär))
links
, => (Komma und Komma-Pfeil)
keine
Listen-Operatoren (rechts-gerichtet)
rechts
not (logisches NICHT geringer Präzedenz)
links
and (logisches UND geringer Präzedenz)
links
or xor (logisches ODER geringer Präzedenz, logisches Exklusiv-ODER)

In Tabelle 2-2 hat ein Operator höhere Präzedenz über alle unter ihm stehenden Operatoren und geringere Präzedenz als alle über ihm stehenden. Operatoren, die auf der gleichen Präzedenzstufe stehen, werden nach den Regeln der Assoziativität aufgelöst.

Die Assoziativität sorgt dafür, daß bei zwei Operatoren gleicher Präzedenz eine bestimmte Reihenfolge eingehalten wird. Dies ist der Fall, wenn zwei gleichrangige Operatoren auf drei Operanden zugreifen wollen:

 4 ** 3 ** 2     # 4 ** (3 ** 2) oder 4 ** 9    (rechts-assoziativ)
 72 / 12 / 3     # (72 / 12) / 3 oder 6/3 oder 2 (links-assoziativ)
 36 / 6 * 3      # (36/6)*3 oder 18

Im ersten Fall ist der Operator ** rechts-assoziativ, runde Klammern werden daher auf der rechten Seite angenommen. Die Operatoren * und / sind dagegen links-assoziativ, die runden Klammern werden also auf der linken Seite angenommen.

Ist es also nötig, die Präzedenz-Tabelle auswendig zu lernen? Nein! Niemand macht das. Benutzen Sie statt dessen lieber runde Klammern, wenn Sie sich in Hinblick auf die Präzedenz nicht sicher sind oder einfach zu viel zu tun haben, um in der Tabelle nachzusehen. Und überhaupt, wenn schon Sie es sich nicht ohne Klammern merken können, wird der Wartungsprogrammierer noch viel größere Schwierigkeiten haben - seien Sie also nett zu ihm (oder ihr).

Vergleichsoperatoren

Um Zahlen miteinander zu vergleichen, besitzt Perl die Operatoren für den logischen Vergleich, die Ihnen vielleicht aus der Algebra bekannt vorkommen. Jeder dieser Operatoren gibt den Wert wahr oder falsch zurück. Wir werden uns im folgenden Abschnitt etwas ausführlicher mit Rückgabewerten beschäftigen. Diese werden vermutlich etwas anders verwendet, als Sie es aus anderen Sprachen kennen. So wird als Gleichheitszeichen der Operator == benutzt und nicht =, das in Perl eine andere Bedeutung (Zuweisung) hat. Für den Test auf Ungleichheit verwenden wir in Perl den Operator != anstelle von <>, da auch dieser Operator bereits mit einer anderen Funktion belegt ist. Auch das Zeichen für »größer als oder gleich« schreiben wir in Perl aus dem gleichen Grund nicht als =>, sondern als >=. Tatsächlich hat in Perl fast jede Folge von Interpunktionszeichen eine spezielle Bedeutung.

Zum Vergleichen von Strings gibt es in Perl ebenfalls spezielle Operatoren, die wie lustige kleine Wörter aussehen: lt le eq ge gt ne. Diese Operatoren vergleichen zwei Strings Zeichen für Zeichen miteinander, um zu sehen, ob sie sich gleichen oder welche von beiden bei der Standardsortierung von Strings zuerst kommen. (Nach dem ASCII-Standard haben Großbuchstaben Vorrang vor Kleinbuchstaben, seien Sie also vorsichtig.)

Die Vergleichsoperatoren (für Zahlen und Strings) finden Sie in Tabelle 2-3:
Tabelle 2-3: Vergleichsoperatoren für Zahlen und Strings
Vergleich
Zahlen
Strings
Gleich
==
eq
Ungleich
!=
ne
Kleiner als
<
lt
Größer als
>
gt
Kleiner als oder gleich
<=
le
Größer als oder gleich
>=
ge

Hier einige Beispiele für die Benutzung der Vergleichsoperatoren:

 35 != 30 + 5         # falsch
 35 == 35.0           # wahr
 '35' eq '35.0'       # falsch (String-Vergleich)
 'fred' lt 'barney'   # falsch
 'fred' lt 'free'     # wahr
 'fred' eq "fred"     # wahr
 'fred' eq 'Fred'     # falsch
 ' ' gt ''            # wahr

Kontrollstrukturen mit if

Sobald Sie in der Lage sind, zwei Werte miteinander zu vergleichen, wollen Sie vermutlich, daß Ihr Programm auf dem Ergebnis basierende Entscheidungen trifft. Wie in anderen Sprachen gibt es auch in Perl eine if-Kontrollstruktur:

 if ($name gt 'fred') {
   print "'$name' folgt nach der Sortierung auf 'fred'.\n";
 }

Falls Sie eine alternative Auswahlmöglichkeit brauchen, können Sie auch das else-Schlüsselwort verwenden:

 if ($name gt 'fred') {
   print "'$name' folgt nach der Sortierung auf 'fred'.\n";
 } else {
   print "'$name' folgt nicht auf 'fred'.\n";
   print "Vielleicht handelt es sich um den gleichen String.\n";
 }

Im Gegensatz zu C müssen in Perl geschweifte Klammern um den von der Bedingung abhängigen Code stehen. Es ist außerdem eine gute Idee, den Inhalt eines Codeblocks wie hier gezeigt einzurücken. Hierdurch ist es leichter nachzuvollziehen, was im Code vorgeht. Wenn Sie einen Texteditor für Programmierer benutzen (wie in Kapitel 1 erwähnt), sollte dieser eigentlich die meiste Arbeit für Sie erledigen.

Boolesche Werte

Tatsächlich können Sie sogar jeden beliebigen skalaren Wert als Bedingung in einer if-Kontrollstruktur verwenden. Dies ist praktisch, wenn Sie einen wahren oder falschen Wert in einer Variablen speichern wollen.

$ist_groesser = $name gt 'fred';
if ($ist_groesser) { ... }

Aber wie unterscheidet Perl, ob ein gegebener Wert nun wahr oder falsch ist? Perl hat im Gegensatz zu anderen Sprachen keinen Booleschen Datentyp. Statt dessen werden ein paar einfache Regeln angewandt:

  1. Der spezielle Wert undef ist falsch. (Wir werden uns hiermit weiter hinten in diesem Abschnitt beschäftigen.)
  2. Null (0) ist falsch; alle anderen Zahlen sind wahr.
  3. Der leere String ('') ist falsch; alle anderen Strings sind normalerweise wahr.
  4. Da Zahlen und Strings gleichbedeutend sind, hat der String '0' den gleichen Wert wie seine numerische Entsprechung: falsch.

Ist Ihr skalarer Wert also undef, 0, '' oder '0', so gilt er in diesem Zusammenhang als falsch. Alle anderen Skalare sind wahr, auch die Arten von skalaren Daten, über die wir noch nicht gesprochen haben.

Wenn Sie das Gegenteil des Booleschen Wertes brauchen, benutzen Sie den unären Nicht-Operator, !. Folgt hierauf ein wahrer Wert, so wird falsch zurückgegeben, folgt ein falscher Wert, so wird wahr zurückgegeben.

 if (! $ist_groesser) {
   # Irgend etwas tun, wenn $ist_groesser nicht wahr ist
 }

Auf Benutzereingaben reagieren

Jetzt fragen Sie sich wahrscheinlich, wie Sie eine Eingabe von der Tastatur in Ihr Perl-Programm bekommen. Hier die einfachste Möglichkeit: Benutzen Sie den Zeileneingabe-Operator <STDIN>.25 Jedesmal, wenn Sie <STDIN> an einer Stelle verwenden, an der ein skalarer Wert erwartet wird, liest Perl die nächste Zeile aus der Standardeingabe (bis zum ersten Newline-Zeichen) und benutzt diesen String als Wert für <STDIN>. Der Begriff Standardeingabe kann in diesem Zusammenhang verschiedene Bedeutungen haben. Sofern Sie nichts Unübliches tun, bedeutet er eine Eingabe auf der Tastatur des Benutzers, der das Programm aufgerufen hat (vermutlich Sie). Wenn es nichts weiter zu lesen gibt (was normalerweise der Fall ist, sofern Sie nicht schon die folgende Zeile eingegeben haben), hält das Perl-Programm an und wartet darauf, daß Sie einige Zeichen, gefolgt von Newline (Return), eingeben.26

Der in <STDIN> stehende Wert endet typischerweise mit einem Newline-Zeichen.27 Sie könnten also etwa folgendes tun:

 $zeile = <STDIN>;
 if ($zeile eq "\n") {
   print "Oh, nur eine leere Zeile!\n";
 } else {
   print "Die eingegebene Zeile lautet: $zeile";
 }

In der Praxis werden Sie das Newline-Zeichen aber eher entfernen wollen. Hierfür gibt es den chomp-Operator.

Der chomp-Operator

Wenn Sie zum erstenmal etwas über den chomp-Operator lesen, erscheint Ihnen dieser vermutlich furchtbar überspezialisiert. Er bearbeitet eine Variable, die einen String enthält. Wenn der String mit einem Newline-Zeichen endet, kann chomp dieses entfernen. Das ist schon (fast) alles, was chomp tut. Zum Beispiel:

 $text = "Eine Zeile Text\n"; # Oder das gleiche aus <STDIN>
 chomp($text);                # Entfernt das Newline-Zeichen

Wie Sie bald erkennen werden, ist chomp so hilfreich, daß Sie es bald in annähernd jedem Ihrer Programme benutzen werden. Die Verwendung von chomp wird durch eine einfache Regel noch einfacher: Immer wenn Sie in Perl eine Variable brauchen, können Sie statt dessen eine Zuweisung benutzen. Zuerst nimmt sich Perl die Zuweisung vor. Daraufhin verwendet es die Variable auf die von Ihnen geforderte Art. Die häufigste Verwendung von chomp sieht daher folgendermaßen aus:

 chomp($text = <STDIN>); # Text einlesen, aber ohne Newline-Zeichen
 
 $text = <STDIN>         # Das gleiche,...
 chomp($text);           # ...aber in zwei Schritten

Zuerst scheint diese Verwendung von chomp nicht der einfachste Weg zu sein, besonders weil sie komplexer aussieht. Wenn Sie sich dieses Verfahren in zwei Schritten vorstellen (eine Zeile einlesen und dann ein chomp ausführen), ist es nur natürlich, es auch in zwei separaten Anweisungen zu schreiben. Wenn Sie es jedoch als einen Schritt betrachten (den Text einlesen - aber ohne das Newline-Zeichen), ist es naheliegender, es auch als eine Anweisung zu formulieren. Da die meisten Perl-Programmierer diese Schreibweise benutzen, können Sie sich auch gleich daran gewöhnen.

Bei chomp handelt es sich eigentlich um eine Funktion. Als Funktion hat chomp einen Rückgabewert, nämlich die Anzahl der entfernten Zeichen. Diese Zahl ist allerdings nur sehr selten von Nutzen:

 $essen = <STDIN>;
 $betty = chomp $essen; # erhält den Wert 1 - aber das wissen wir
                        # auch so!

Wie Sie sehen, können Sie chomp mit oder ohne runde Klammern verwenden. Dies ist eine weitere allgemeine Regel in Perl: Runde Klammern müssen nur dann wirklich verwendet werden, wenn sie die Bedeutung eines Ausdrucks verändern.

Endet eine Zeile mit zwei oder mehr28 Newline-Zeichen, so entfernt chomp nur das erste. Steht kein Newline-Zeichen am Ende der Zeile, so tut chomp nichts und gibt null zurück.

Bei der Arbeit mit älteren Perl-Programmen läuft Ihnen vielleicht der chop-Operator über den Weg. Er funktioniert so ähnlich wie chomp, entfernt aber jedes beliebige Zeichen am Ende einer Zeile, nicht nur das Newline-Zeichen. Da es aber auch mehrere Brontosaurier-Steaks wieder in ein Brontosaurier-Steak verwandeln kann, ist es normalerweise nicht das, was Sie wollen.

Kontrollstrukturen mit while

Wie die meisten auf Algorithmen basierenden Programmiersprachen besitzt auch Perl eine Reihe von Schleifenstrukturen.29 Die while-Schleife wiederholt einen Anweisungsblock so lange, wie eine Bedingung wahr ist:

 $zaehler = 0;
 while ($zaehler < 10) {
   $zaehler += 1;
   print "Der Zaehler steht jetzt auf $zaehler\n"; 
   # Gibt die Werte von 1 bis 10 aus
 }

Wie wir es bereits vom if-Test kennen, steht auch hier der Bedingungsteil in runden Klammern. Analog dazu muß der dazugehörige Anweisungsblock wieder in geschweiften Klammern stehen. Der Ausdruck, der die Bedingung enthält, wird zuerst ausgewertet. Dadurch wird die Schleife komplett übersprungen, sofern die Bedingung schon zu Beginn falsch ist.

Der Wert undef

Was geschieht, wenn Sie eine skalare Variable verwenden, bevor Sie ihr einen Wert zugewiesen haben? Nichts Ernstes und sicher nichts wirklich Fatales. Bevor einer Variablen ein Wert zugewiesen wird, besitzen Variablen den speziellen Wert undef. Dies ist die Art von Perl zu sagen: »Hier gibt es nichts zu sehen, bitte weitergehen, bitte weitergehen!«. Wenn Sie versuchen, dieses »Nichts« als numerischen Wert zu verwenden, verhält es sich wie 0. Wenn Sie versuchen, es als String zu benutzen, verhält es sich wie ein leerer String. undef ist jedoch weder eine Zahl noch ein String; es ist eine vollkommen eigenständige Art von skalarem Wert.

Da sich undef automatisch wie 0 verhält, wenn es als Zahl benutzt wird, ist es recht einfach, einen Zähler zu erzeugen, der bei null beginnt.

 $n = 1;
 while ($n < 10) {
   $summe += $n;
   $n += 2; # Zur nächsten ungeraden Zahl springen
 }
 print "Das Ergebnis ist $summe.\n";

Dies funktioniert korrekt, wenn $summe zu Beginn der Schleife den Wert undef hat. Beim ersten Schleifendurchlauf hat $n den Wert 1. Dieser Wert wird nun zu $summe hinzugezählt. Das ist, als ob Sie 1 zu einer Variablen hinzuzählen, die bereits den Wert 0 enthält (da wir undef hier benutzen, als wäre es eine Zahl). $summe hat jetzt also den Wert 1. Nachdem die Variable nun initialisiert ist, funktioniert die Addition wie gewohnt.

Auf ähnliche Weise können Sie eine Variable für einen String anlegen, der zu Beginn leer ist:

$zeichenkette .= "mehr Text\n";

Enthält die Variable $zeichenkette den Wert undef, verhält sie sich, als würde sie bereits einen leeren String enthalten, zu dem "mehr Text\n" hinzugefügt wird. Enthält $zeichenkette jedoch schon einen Wert, so wird der neue Text einfach angehängt.

Perl-Programmierer benutzen neue Variablen oft, indem sie die Variable entweder als 0 oder als leeren String verwenden.

Viele Operatoren geben undef zurück, wenn die Argumente Gültigkeitsgrenzen überschreiten oder keinen Sinn ergeben. Wenn Sie nicht etwas Besonderes tun, sollten Sie ohne weitere Konsequenzen eine Null oder einen leeren String zurückbekommen. In der Praxis ist dies selten ein Problem. Tatsächlich verlassen sich die meisten Programmierer auf dieses Verhalten. Das sollte Ihnen jedoch bereits bekannt sein, wenn Sie die Warnungen eingeschaltet haben. Typischerweise warnt Perl Sie, wenn undef nicht ordnungsgemäß benutzt wird. Zum Beispiel ist es kein Problem, undef von einer Variablen in die nächste zu kopieren. Versuchen Sie aber, diesen Wert mit print auszugeben, führt dies normalerweise zu einer Warnung.

Die Funktion defined

Einer der Operatoren, die undef zurückgeben können, ist der Zeileneingabeoperator <STDIN>. Normalerweise wird eine Zeile Text zurückgegeben. Existieren jedoch keine weiteren Eingaben mehr, wie etwa am Ende einer Datei, so wird statt dessen undef zurückgegeben.30 Um zu unterscheiden, ob ein Wert nun tatsächlich undef ist oder etwa ein leerer String, können Sie die defined-Funktion verwenden. Ist der Wert undef, so wird falsch zurückgegeben, in allen anderen Fällen wahr:

 $madonna = <STDIN>;
 if ( defined($madonna) ) {
   print "Die Eingabe lautet $madonna";
 } else {
   print "Keine Eingabe verfuegbar!\n";
 }

Wenn Sie Ihren Variablen selbst den undefinierten Wert zuweisen wollen, so können Sie hierfür den Operator mit dem seltsamen Namen undef verwenden:

$madonna = undef; # Als wäre sie niemals berührt worden

Übungen

Die Lösungen zu den folgenden Übungen finden Sie in Anhang A.

  1. [5] Schreiben Sie ein Programm, das den Umfang eines Kreises berechnet, der einen Radius von 12,5 besitzt. Der Umfang beträgt 2p, multipliziert mit dem Radius des Kreises (ungefähr 2 mal 3,141592654). Das Ergebnis sollte etwa 78,5 betragen. (Denken Sie daran, daß das Komma im Englischen durch einen Punkt zu ersetzen ist.)
    Zur Lösung
  2. [4] Ändern Sie das Programm aus der vorigen Übung so ab, daß es den Benutzer, der das Programm ausführt, nach einem Radius fragt und diese Eingabe zur Berechnung des Umfangs benutzt. Wird also beispielsweise 12,5 als Wert eingegeben, so sollte das Ergebnis das gleiche sein wie das der vorigen Übung.
    Zur Lösung
  3. [4] Ändern Sie das Programm aus der vorigen Übung so ab, daß eine Eingabe kleiner als null keinen negativen Wert ergibt, sondern null.
    Zur Lösung
  4. [8] Schreiben Sie ein Programm, das nach zwei Zahlen fragt und diese (auf zwei separaten Eingabezeilen) einliest. Nachdem diese zwei Zahlen miteinander multipliziert wurden, soll das Ergebnis wieder ausgegeben werden.
    Zur Lösung
  5. [8] Schreiben Sie ein Programm, das den Benutzer nach einem String und einer Zahl fragt und diese (aus zwei separaten Eingabezeilen) einliest. Der String soll so oft ausgegeben werden, wie durch die Zahl angegeben wurde. (Tip: Verwenden Sie den »x«-Operator.) Gibt der Benutzer »fred« und »3« ein, sollte dreimal die Zeile »fred« ausgegeben werden. Gibt der Benutzer »fred« und »299792« ein, sollte es recht viele Ausgabezeilen geben. .
    Zur Lösung

Fußnoten

1

Das hat, bis auf die Tatsache, daß ein Skalar etwas »Einzelnes« ist, wenig mit einem ähnlichen Begriff aus der Mathematik oder der Physik zu tun; in Perl gibt es keine »Vektoren«.

2

Wenn Sie schon einmal andere Programmiersprachen benutzt haben, stellen Sie sich unter Hallo anstatt einer einzelnen Sache vermutlich eher eine Reihe von fünf Zeichen vor. In Perl gilt ein String jedoch als einzelner skalarer Wert. Hierbei ist es selbstverständlich möglich, auch auf die einzelnen Zeichen zuzugreifen, sofern dies nötig ist.

3

In Perl wird anstelle des Dezimalkommas wie im Amerikanischen üblich ein Dezimalpunkt verwendet.

4

Eine Fließkommazahl doppelter Genauigkeit ist das, was der C-Compiler, mit dem Perl übersetzt wurde, aus der Deklaration double gemacht hat. Auch wenn sich die Größe von Rechner zu Rechner unterscheiden kann, wird von den meisten Systemen das IEEE-Fließkomma-Format verwendet, das mit einer Genauigkeit von 15 Ziffern und einem Bereich von mindestens 1e-100 bis 1e100 arbeitet.

5

Manchmal benutzt Perl intern auch Integer-Werte. Dies geschieht aber auf eine Art und Weise, die dem Programmierer verborgen bleibt. Das einzige, was Ihnen hierbei auffallen sollte, ist, daß Ihr Programm schneller läuft. Und wer wollte sich darüber schon beschweren?

6

Na gut, es gibt das integer-Pragma. Genau zu erklären, wie das funktioniert, würde den Rahmen dieses Buches jedoch sprengen. Und es gibt auch Fälle, in denen ganzzahlige Werte aus einer gegebenen Fließkommazahl berechnet werden, wie wir später sehen.

7

Die »vorangestellte Null« als Indikator funktioniert ausschließlich für Literale - nicht für die automatische Konvertierung von Zeichenketten in Zahlen, die wir weiter hinten in diesem Kapitel behandeln. Wollen Sie eine Zeichenkette, die wie eine oktale oder eine hexadezimale Zahl aussieht, in einen dezimalen Wert umwandeln, so können Sie dies mittels der oct( )- oder hex( )-Funktionen erledigen. Für die Konvertierung von binären Werten gibt es keinen speziellen »bin()«-Operator. Dies läßt sich bei Zeichenketten, die mit 0b beginnen, mittels des oct( )-Operators erledigen.

8

Vorsicht! Das Ergebnis einer Modulo-Operation, bei der eine oder zwei negative Zahlen beteiligt sind, kann sich zwischen verschiedenen Perl-Implementierungen unterscheiden.

9

Normalerweise ist es nicht möglich, eine negative Zahl mit einem nicht-ganzzahligen Exponenten zu potenzieren. Mathematik-Experten wissen, daß das Ergebnis eine komplexe Zahl wäre. Um dies zu ermöglichen, müssen Sie das Modul Math::Complex verwenden.

10

Im Gegensatz zu C oder C++ hat das NUL-Zeichen in Perl keine besondere Bedeutung, da Perl das Stringende mittels der Länge und nicht mit dem Nullbyte bestimmt.

11

Es gibt außerdem noch here-Strings, ähnlich den here-Dokumenten in der Shell. Die Dokumentation finden Sie in der perldata-Manpage.

12

In neueren Versionen von Perl gibt es außerdem noch sogenannte »Unicode«-Escapes. Diese werden aber hier nicht weiter behandelt.

13

Der Trick mit der »führenden Null«, um einen nichtdezimalen Wert zu erzeugen, funktioniert nur bei Literalen, aber niemals bei der automatischen Konvertierung. Benutzen Sie hex( ) oder oct( ), um die Strings umzuwandeln.

14

Es sei denn, Sie haben die Warnungen eingeschaltet, zu denen wir gleich kommen.

15

Wir werden in Kürze auf runde Klammern und Präzedenz eingehen.

16

In der Regel ist es nicht von Bedeutung, aber diese Umwandlungen können geringfügige Rundungsfehler hervorrufen. Wenn Sie mit einer Zahl beginnen, diese in einen String umwandeln und diesen wieder in eine Zahl, kann es sein, daß das Ergebnis nicht exakt die Zahl ist, mit der Sie begonnen haben. Dies ist keine Eigenart von Perl, sondern eine Folge des Umwandlungsprozesses und geschieht bei jeder mächtigen Programmiersprache.

17

Wie wir sehen werden, kann eine skalare Variable immer nur einen Wert enthalten. In anderen Variablentypen, wie Arrays und Hashes, lassen sich dagegen auch mehrere Werte ablegen.

18

Der Begriff »binär« hat in diesem Zusammenhang nichts mit binären Zahlen zu tun. Er bedeutet nur, daß diese Operatoren zwei Werte benutzen. So ist zum Beispiel die Subtraktion eine binäre Operation. Im Gegensatz hierzu gibt es auch »unäre« Operatoren, die nur einen Operanden verwenden. Das Minuszeichen (-) ist beispielsweise ein unärer Negationsoperator; z. B. $barney = - $fred. Um es noch weiter zu treiben: Perl hat sogar einen »ternären« Operator (den wunderbaren ?:-Operator). Wir überlassen es Ihnen herauszufinden, wie viele Operanden hier benutzt werden.

19

Dies hat nichts mit der mathematischen oder statischen Interpolation zu tun.

20

Sowie einige andere Variablentypen die wir allerdings erst später kennenlernen werden.

21

Hierbei handelt es sich eigentlich um den undefinierten Wert undef, auf den wir weiter hinten in diesem Kapitel zurückkommen werden. Wenn Sie die Warnungen eingeschaltet haben, wird Perl Sie auf den Versuch hinweisen, eine undefinierte Variable zu interpolieren.

22

Na gut, manchmal kann hiermit die Interpretation der Variablen als String anstelle einer Zahl erzwungen werden. Dies kann in seltenen Fällen nötig sein, ist aber meistens nur unnötige Tipperei.

23

Es gibt noch weitere Zeichen, die eventuell für Probleme sorgen können. Wollen Sie eine linke eckige oder geschweifte Klammer direkt nach einem Variablennamen benutzen, stellen Sie ihr einen Backslash voran. Dies sollten Sie auch tun, wenn auf den Variablennamen ein Apostroph oder ein Paar Doppelpunkte folgt. Alternativ dazu können Sie aber auch, wie im Text beschrieben, geschweifte Klammern benutzen, um den Variablennamen vom Rest abzugrenzen.

24

C-Programmierer freuet Euch! Die Operatoren, die in C und Perl gleichermaßen vorkommen, haben in beiden Sprachen die gleiche Präzedenz und Assoziativität.

25

Eigentlich handelt es sich hierbei um den Zeileneingabe-Operator, der auf das Dateihandle STDIN zugreift. Allerdings können wir Ihnen darüber nichts weiter erzählen, bis wir uns mit Dateihandles beschäftigen (in Kapitel 11, Dateihandles und Dateitests).

26

Um ehrlich zu sein, ist es eigentlich Ihr System, das auf die Eingabe wartet, während Perl auf Ihr System wartet. Auch wenn die Details von Ihrem System und dessen Konfiguration abhängen, können Sie Tippfehler in der Regel durch die Eingabe eines Rückschritts korrigieren, bevor Sie die Return-Taste drücken - hierfür ist Ihr System zuständig, nicht Perl. Falls Sie mehr Kontrolle über die Eingaben brauchen, können Sie das Modul Term::ReadLine aus dem CPAN benutzen.

27

Die Ausnahme besteht darin, daß der Eingabestrom plötzlich in der Mitte der Zeile abbricht. Aber das ist natürlich keine korrekte Textdatei.

28

Diese Situation kann nicht auftreten, wenn Sie Eingaben zeilenweise einlesen. Sie kann aber eintreten, wenn Sie das Trennzeichen für Eingabedatensätze ($/) auf einen anderen Wert als das Newline-Zeichen eingestellt haben, die read-Funktion verwenden oder einige Zeilen von Hand zusammengeklebt haben.

29

Jeder Programmierer erzeugt irgendwann einmal eine Endlos-Schleife. Hört Ihr Programm einfach nicht auf zu laufen, können Sie es normalerweise wie jedes andere Programm auf Ihrem System beenden. Oft hilft die Eingabe von Control-C. Die Dokumentation zu Ihrem System sollte genauer darüber Aufschluß geben.

30

Kommt die Eingabe von der Tastatur, so gibt es normalerweise kein »End-of-file« (Dateiende). Es kann jedoch sein, daß die Eingabe so umgeleitet wurde, daß sie statt von der Tastatur aus einer Datei kommt, oder daß der Benutzer die Taste gedrückt hat, die dem System ein Dateiende anzeigt.


TOC PREV Übungen NEXT INDEX

Copyright © 2002 by O'Reilly Verlag GmbH & Co.KG