Verschiedenes
Wer bis hierhin gefolgt ist, der ist schon in der Lage, kleine oder nicht mehr ganz so kleine Programme zu schreiben. Das ist ein guter Zeitpunkt, um auf ein paar Dinge hinzuweisen.
Coding Style
Perl erlaubt es einem, an fast beliebigen Stellen Lehrzeichen und Zeilenumbrüche einzufügen oder weg zu lassen - das sollte aber kein Grund sein, das zu tun.
Tatsächlich hängt die Lesbarkeit eines Programms ganz stark davon ab, wie es formatiert ist, und dass Variablen (und später auch Funktionen) aussagekräftige Namen haben.
Das bedeutet aber nicht, dass alle Variablen sich selbst beschreiben müssen:
for (my $schleifen_variable = 1; $schleifen_variable < 10; $schleifen_variable++){ say $schleifen_variable, " zum Quadrat ist ", $schleifen_variable * $schleifen_variable; }
Ist sicherlich übertrieben. Als Grundregel sollte man nehmen: Je größer der Bereich eines Programms ist, in dem eine Variable benutzt wird, desto aussagekräftiger sollte der Name sein.
In obiger Schleife wäre es vollkommen in Ordnung gewesen, der
Variablen einen Namen mit einem Buchstaben, wie z.B. $i
zu geben, aber wer in einem mehrere tausend Zeilen langem Programm
eine Variable verwendet, die überall gültig ist, und nur aus einem
Buchstaben besteht, gehört erschossen.
Auch sollte man sich angewöhnen, nach jeder öffnenden geschweiften Klammer den Code einen Tab weiter einzurücken (alternativ 4 oder 8 Leerzeichen), und nach der entsprechenden schliessenden Klammer wieder ausrücken, so wie das hier in den Beispielen immer der Fall ist:
if $a < $b { # nach 'if' ging eine Klammer auf, deswegen # ist der Text hier eingerückt } # nach der schliessenden Klammer ist der Code nicht mehr # eingerückt.
Ausserdem sollte man darauf achten, dass Zeilen nicht mehr als 80 Zeichen lang sind.
Wenn man sich nicht an solche Regeln hält, kann z.B. so etwas heraus kommen:
s''$/=\2048;while(<>){G=29;R=142;if((@a=unqT="C*",_)[20]&48){D=89;_=unqb24,qT,@ b=map{ord qB8,unqb8,qT,_^$a[--D]}@INC;s/...$/1$&/;Q=unqV,qb25,_;H=73;O=$b[4]<<9 |256|$b[3];Q=Q>>8^(P=(E=255)&(Q>>12^Q>>4^Q/8^Q))<<17,O=O>>8^(E&(F=(S=O>>14&7^O) ^S*8^S<<6))<<9,_=(map{U=_%16orE^=R^=110&(S=(unqT,"\xb\ntd\xbz\x14d")[_/16%8]);E ^=(72,@z=(64,72,G^=12*(U-2?0:S&17)),H^=_%64?12:0,@z)[_%8]}(16..271))[_]^((D>>=8 )+=P+(~F&E))for@a[128..$#a]}print+qT,@a}';s/[D-HO-U_]/\$$&/g;s/q/pack+/g;eval
Das ist Perl 5-Code, und auch wenn nicht alles so funktionert wie in Perl 6, können Sie sicher sehen, dass Sie auch kaum etwas verstehen würden, wenn Sie Perl 5 kennen würden.
Tatsächlich macht dieser Code etwas sinnvolles: Er umgeht die CSS ("Content Scrambling System")-Verschlüsselung von DVDs - in nur 6 Zeilen Perl-Code. Quelle: Keith Winstein und Marc Horowitz.
Also: formatieren Sie Ihren Quellcode lesbar und konsequent, geben Sie Variablen ordentliche Namen und fügen Sie Kommentare ein, wo es sinnvoll ist. Es wird Ihnen letztendlich helfen, Zeit zu sparen.
Zusammengesetzte Zuweisungen
In den bisherigen Beispielen kam ab und zu mal eine Anweisung dieser Form vor:
$a = $a + $b;
Tatsächlich kommt es relativ häufig vor, dass eine Variable auf beiden Seiten einer Zuweisung vorkommt. Deswegen gibt es unter Perl (und in ein paar anderen Programmiersprachen auch, wie z.B. in C) eine Kurzschreibweise dafür:
$a += $b; # das gleiche wie $a = $a + b; $a -= $b; # das gleiche wie $a = $a - b; $a *= $b; # das gleiche wie $a = $a * b; $a /= $b; # das gleiche wie $a = $a / b;
Das geht noch mit anderen Operatoren, wie % (Modulo,
also Rest einer Division), ** (Potenzierung) und noch
mehr Operatoren, die bisher noch gar nicht hier aufgetaucht sind.
Inkrementierung und Dekrementierung
Programmierer sind notorisch schreibfaul, und weil Variablen so häufig um 1 erhöht oder erniedrigt werden müssen, gibt es dafür eine weitere Schreibweise:
my $i = 3; $i++; # das gleiche wie $i = $i + 1; oder $i += 1; $i--; # das gleiche wie $i = $i - 1; oder $i -= 1;
Diese Operatoren heißen Inkrement- (++) und Dekrement-
Operator (--).
Tatsächlich gibt es noch eine Form:
my $i = 3; ++$i; # das gleiche wie $i++; --$i; # das gleiche wie $i--;
Allerdings sind die Formen $i++ und ++$i
nicht immer identisch:
my $i = 3; my $a = ++$i; # hier haben $i und $a beide den Wert 4. my $k = 3; my $b = $k++; # hier hat $k den Wert 4, aber $b den Wert 3
Also: Wenn ++$i in einer Anweisung steht, wird erst
die Variable um eins erhöht, und dann der Wert der Variablen auf der
linken Seite (hier: $a) geschrieben.
In der Form $i++ wird erst die Zuweisung
ausgeführt, dann $i um eins erhöht.
Am Anfang ist es empfehlenswert, diese Subtilität zu vermeiden, und diese Operatoren nur zu verwenden, wenn es der einzige Befehl in dieser Anweisung ist.
Alles hat einen Namen
Für alles in einer Programmiersprache gibt es einen Namen, meistens einen englischen.
Ohne den Fachjargon kommt man auf Dauer nicht aus. Für den Anfang muss man ihn aber nicht aktiv beherrschen, es reicht die Begriffe zu verstehen, wenn man sie liest.
Ausdrücke
Alles, was einen Wert zurückliefert, heißt Ausdruck, auf Englisch Expression.
1 ist ein Ausdruck (liefert den Wert 1 zurück),
3+4*$a ist ein Ausdruck, und sogar
my $a = 5;
ist ein Ausdruck, der den Wert 5 liefert. Daher ist auch das hier erlaubt:
my $b = my $a = 5;
Operatoren
Einige Operatoren haben Sie schon kennen gelernt: +,
<, eq (String-Vergleich), ein paar wurden
schon benutzt, ohne explizit als Operator bezeichnet zu werden:
= für die Zuweisung (wie in $a = 3), und das
Komma , (wie in say "Summe: ", $a + $b; mehr
dazu, was das Komma macht, im nächsten Abschnitt).
Operatoren sind Bestandteile einer Sprache, meistens aus Sonderzeichen bestehend, die mit Ausdrücken arbeiten. Diese Ausdrücke nennt man Operanden.
Man klassifiziert Operatoren danach, wie viele Operanden sie benötigen:
Unäre Operatoren arbeiten nur mit einem Operand, z.B. das
Minus in my $a = -1;.
Die meisten Operatoren sind binär, d.h. sie arbeiten mit
zwei Operanden, wie z.B. * in my $a = 2 *
3;. Auch + und - sind binär, d.h. sie
haben sowohl eine binäre als auch eine unäre Form.
Es gibt auch ab und zu ternäre Operatoren, die drei Argumente benötigen, die sind aber bisher noch nicht von Interesse.
Boolsche Ausdrücke
Bedingungen wie $a < 5 sind sogenannte
Wahrheitswerte oder Booolsche Ausdrücke, auf Englisch "Boolean
Expression". Sie können nur die Werte True oder
False annehmen.
In Perl kann jeder Ausdruck als Boolscher Ausdruck verwendet
werden, wobei ein Ausdruck als False gilt, wenn er 0 oder
der leere String "" ist, sonst True.