Perl 6

Die Zukunft des Programmierens

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.