Perl 6
Perl 6 Tutorial Part 1: Revision 27


Motivation for a friendly Perl 6-Tutorial

Perl 6 appears slowly before the wondering eyes of the curious, but if they grab Rakudo and the documentation (aka synopses) and try to write their first program, they often don't get too far. The language changes a bit every week and Rakudo nor Pugs know every command. The synopses aren't an easy read either. They are huge and contain a lot of nifty words. More written to clear edge cases to computer science students than to help the noobs to get a grasp. Therefore we would need a tutorial that introduces the reader slowly into the world of Perl 6 and prerequests as little knowledge as possible. Of course some basic programming skills are needed and some Perl 5 wisdom is helpful, but everything else will be explained on the way. Every chapter of this tutorial is focused on one topic and contains many examples, so you can start to play with the language, which I encourage you to do. Because a start is made quickly but it takes time to really lern Perl and the new generation is optimized even on that.

Hello Perl 6

Nearly every introduction starts with a "Hello World" example. I tried to come up with something more original, but its still the smallest, simplest program that does something joyfully useful. So shall we start with something worn out?, no something well-tried:

say "Greetings, earthlings, err Perl 6 neophytes.";

This first program outputs the expected text. The command say corresponds to the familiar print, but appends a line ending appropriate to the current operating system (e.g., a newline under Unix, a carriage return and newline under Windows). The print command is still available, but the new idiom is to use say. I can already hear the objections of the more experienced Perl monger: A good script begins with strict and warnings. And right they are. In Perl 5 the program should read:

Perl 5:

use strict;
use warnings;

print "Greetings, earthlings, err Perl 6 neophytes.\n";

But in Perl 6 there is no need, because both pragmas are now enabled by default. This saves not only the two lines of code, which are in almost all of my programs, but it helps those who know nothing about the pragmas become aware of potential problems sooner. If necessary, one or both may be disabled with no strict or no warnings.

Parentheses and Curly Braces

The next step in tutorials is often to introduce a variable, to which we assign a value and then reference:

my $a = 3;
say "I juggle with $a balls.";

We see that scalars still contain a single value (of any data type) and still use the sigil $ there's nothing more to explain. The variable is declared with my in the familiar lexical local scope, since use strict is in effect. Perhaps playing with one or two balls shouldn't be called juggling:

my $a = 3;
if $a > 2 { say "I juggle with $a balls." }


Da Skalare immer noch Variablen sind, die einen einzelnen Wert speichern (egal
welchen Datentyps ) und immer noch mit der Sigil '$' anfangen, gibt es hier nichts
weiter zu erklären. Die Variable ist natürlich mit 'my' als lexikalisch lokal deklariert, da 'use strict' gilt. Vielleicht könnte ich ein 'if' einfügen, da ich Artistik mit
ein oder zwei Bällen nicht jonglieren nennen würde.

Perl 6:

my $a = 3;
if $a > 2 { say "Ich jongliere mit $a Bällen." }

Und hier sehen wir schon einen Unterschied zu Perl 5, der angenehm auffällt.
Der dem 'if' folgende Term kann, muß aber nicht mehr, in runde Klammern gesetzt werden. Runde Klammern dienen in Perl 6 nur noch dem Gruppieren. Hat man jedoch keine verschachtelte Struktur, sondern nur eine einzelne Anweisung oder eine einfache Folge davon, werden sie nicht benötigt. Dies gilt überall. Auch ein Array, eine Variable die mehrere Werte speichert, kann nun ohne runde Klammern gefüttert werden.

Perl 6:

my @primzahlen = 2,3,5,7;

Dies ist auch möglich, weil das Komma jetzt ein listenerzeugender Operator ist. Die
zweite, nicht ganz so offensichtliche Neuheit in Perl 6, die das Listing 4 zeigt,
ist das Fehlen eines abschließenden Semikolons. Seit Perl 1.0 trennt das Semikolon
einzelne Befehle. Lediglich der letzte Befehl innerhalb geschweifter Klammern
(in einem Block), muß nicht mit einem Semikolon abgeschlossen werden. Auch das
sieht man in Listing 4. Um sich nicht mehr merken zu müssen, wann nach einer
schließenden geschweiften Klammer ein Semikolon zu stehen hat und wann nicht
(diese Regeln wurden weitestgehend aus C übernommen), hat Larry beschlossen, daß jedes Semikolon nach geschweiften Klammern ab jetzt freiwillig (optional) ist. Bei 'if'-Blöcken gilt das auch in Perl 5, aber nicht z.B. bei 'eval'-Blöcken.

Perl 5:

eval { print "Finden sie alle 3 Unterschiede !\n" };

Perl 6:

try { say "Finden sie alle 3 Unterschiede !" }

Der dritte Unterschied ergab sich, weil 'eval' jetzt nur noch Strings auswertet und für das Ausführen von Blöcken probehalber, nun 'try' statt 'eval' zu verwenden ist.

Ein nicht mehr ganz so freies Format

In Sachen Formatierung ist Perl allerdings etwas strenger geworden. Leerzeichen
können nicht mehr überall nach belieben eingefügt werden. Natürlich ist die Breite
der Einrückungen, sowie generell die Anzahl der Leerzeichen und Zeilenumbrüche
zwischen 2 Bestandteilen eines Ausdrucks unerheblich.

Perl 6:

$b = $a ; # Zuweisung eines Wertes
$C = $a; # jetzt ich hab noch eine Kopie des Wertes
$d
=
$a
; # und noch eine

Aber Leerzeichen und Zeilenumbrüche haben schon eine trennende Wirkung. Gerade
bei Operatoren sollte man jetzt stärker darauf achten. Besonders der neue Präfix-
Operator ('='), der teilweise die beliebte Funktion des Diamantoperators ('<>')
übernimmt, kann leicht für eine Zuweisung gehalten werden. Oder auch folgende 2
Anweisungen laden zu unterhaltsamen Verwechslungen ein:

Perl 6:

$b = =$a; # Zuweisung einer Zeile aus einem Datenstrom
$b == $a; # numerischer Vergleich

Das gleiche Zeichen kann jetzt mehrere Operatoren darstellen, je nachdem, wie es
von Leerzeichen umgeben ist:

Perl 6:

++$b # Präfix-Operator, Autoinkrement vor Evaluierung
$b++ # Postfix-Operator, Autoinkrement nach Evaluierung
+$a # Präfix-Operator, das selbe wie num $a, ähnlich int $a
$a + $b; # Infix-Operator, Addition
=$b # Präfix-Operator, Zeile aus einem Datenstrom
$a = $b; # Infix-Operator, Zuweisung
$a # Circumfix-Operator, Teilarray oder Reduktionsoperator
< $a> # Circumfix-Operator, qw()
<< $a >> # Circumfix-Operator, interpolierendes qw()

Diese Unterscheidungen sind nicht gänzlich neu, da beide Arten des Autoinkrementes
schon in C bekannt sind. Unerwartete Probleme kann es für Umsteiger aber auch beim
Schreiben von Arrays, Hashes und von Objekten geben. Folgende Schreibweisen werden
nicht mehr erkannt:

Perl 5:

$array $i;
$hash {$k};
$obj -> methode ();

Wer seinen Quellcode so formatieren möchte, daß bestimmte Teilausdrücke oder die
Zeilenenden genau untereinander stehen, braucht in Perl 6 die "long dot" genannte
Schreibweise:

Perl 6:

@array\ .$i; # ein Wert aus einem Array
%hash\ .{ $k }; # ein Wert aus einem Hash
$obj\ # ich kann auch Kommentare einfügen
.methode ( ) ; # manche Leerzeichen sind erlaubt

Blitzmerker haben aus diesem Code bereits geschlossen, daß Arrays nun immer mit
'@' anfangen, Hashes nun immer mit '%' und das der Punkt das Objekt und den Namen
der Methode trennt, wozu früher ein Pfeil ('->') diente (z.B.:'$obj.methode()').
Daß der Backslash ('\') die nachfolgenden Leerzeichen und Zeilenumbrüche "quotet",
also ihrer normalen Bedeutung enthebt, ist auch nichts wirklich Ungewöhnliches.
Das Stirnrunzeln beim Betrachter dieser Zeilen erwarte ich erst, sobald sein Hirn
diese beiden Gedanken verbindet und die Frage auftaucht: Der Sliceoperator (die
Klammern hinter einer Variable, mit deren Hilfe wir einzelne Werte, also Teile
(slices), eines Arrays oder Hashes geliefert bekommen) ist doch nicht ernsthaft
eine Methode des Objektes vom Typ Array oder Hash? Doch, ist es. Perl 6 ist so
objektorientiert wie Ruby, auch wenn es sein möglichstes tut, daß vor dem Benutzer
zu verbergen. Zum Beispiel dadurch, in dem es oftmals den Punkt optional läßt.
Statt dem auch möglichen '@array.3' reicht wie gewohnt ein '@array[3]'. Nur in
diesem Sonderfall, wenn man zwischen Objekt und Methode Leerzeichen einfügen will,
muß der Punkt verwendet werden, um Doppeldeutigkeiten zu vermeiden. Der Backslash darf auch nicht fehlen, denn ein '.say' ist in Perl 6 eine andere Schreibweise für '$.say' oder auch 'say $'. Steht also ein Punkt vor einem Befehl, sucht Perl kein vorher erwähntes Objekt, dessen Methode hier aufgerufen werden soll, sondern interpretiert diesen Befehl als Methode der aktuellen Kontextvariable, die immernoch, wie in Perl 5, '$_' heißt.

noch Kommentare?

In allen bisherigen Beispielen war es zu sehen: Wie aus Perl 5, anderen Sprachen
und Unix-Shells bekannt, leitet auch in Perl 6 die Raute ('#') einen Kommentar
ein, der mit der selben Zeile endet. Neu in Perl sind jedoch Kommentare, deren
Ende sich bestimmen läßt. Diese können mitten in eine Zeile eingefügt werden oder
sich über mehrere Zeilen erstrecken. Solche Kommentare beginnen auch mit einer
Raute, der jedoch unmittelbar eine Klammer folgt. Als Klammern gelten die Zeichen
'()', '[]','{}' und '<>', wobei natürlich die zugehörige schließende Klammer den
Kommentar beendet. Dabei kann man stets die Klammern wählen, die sich optisch vom
Quellcode abheben. Dies kennt man in Perl 5 schon von den Regulären Ausdrücken
und vom Quoting, aber zur Verdeutlichung einige Beispiele:

Perl 6:

my $a #( = 6; ) = 5; # es 5 wird zugewiesen
say "$a #(????) $a"; #( Ausgabe von '5 #(????) 5'
keine Kommentare innerhalb von Strings )

$affe#.schreit().guckt() # der schreit nicht, der guckt nur
@zahlen#({ ?? ).reverse; reingefallen alles noch Kommentar
}).sort; # gibt sortierte Version des Arrays zurück

Die letzten beiden Beispiele zeigen, daß mehrere Klammern benutzt werden dürfen.
Dabei hat man nur darauf zu achten, beim Abschließen des Kommentars genau die
passende Art, Anzahl und Reihenfolge der Klammern zu verwenden. Manche mögen darin
wieder neue Wege sehen, unleserlichen Quelltext zu schreiben, aber hinter dem
Vorgestelltem steht vor allem eine neue Arbeitslogik des Perlinterpreters, die
einige aufdringliche und einige leicht zu übersehende Problemfälle bereinigt.

Setz es in "Anführungszeichen"

Mit der Arbeitslogik meine ich das "one-pass parsing", zu deutsch: ein Interpreter
kann in einem Durchgang den Code vollständig erfassen. Mit Perl 5 ist das leider
anders. Hier schaut der aufgebohrte Bison-Parser öfters vor und zurück, um zu
erkennen, was der Programmierer grad von ihm möchte und wechselt dabei zwischen
verschiedenen Zuständen, wie etwa: "Dies ist Kommentar", oder "Dies ist gerade
eine Anweisung". Perl 6 kennt nicht die Sonderregeln und Doppeldeutigkeiten,
welche dies notwendig machten. Das macht die Interpreter nicht nur schlanker und
schneller, sondern auch narrensicherer. Beim Einlesen kann ein Perl 6-Interpreter
die Quellen in immer kleinere Bedeutungseinheiten aufspalten. Selbst wenn eine
dieser Bedeutungseinheiten keinen Sinn ergibt (eine Katze über die Tastatur lief),
beeinträchtigt dies nicht den Rest des Programmes. Ein Perl 5-Beispiel mit einer
Regex, die mit Kommentaren versehen ist zeigt, welche hinterhältigen Fehler die
alte Lesart bisher erlaubte:

Perl 5:

/ ( # begin der capture
\w+ # Buchstaben und / oder Zahlen
| # nächste Alternative
...
) /x;

Der Slash ('/') im Kommentar läßt perl vermuten, hier sei die Regex zu Ende und
wird vom Nachfolgendem sehr sehr verwirrt. In Perl 6 haben Kommentare keinen
Einfluß mehr auf Anweisungen und auch Dokumentation (POD) kann überall eingefügt
werden, ohne daß es mißverstanden wird. Auch öffnende Klammern, denen ihr Gegenstück
fehlt, werden in Perl nun wohlwollend übergangen. Allerdings ist im täglichen
Gebrauch vor allem folgende Konsequenz dieser Technik wirklich praktisch:

Perl 6:

say "Und der Gewinner ist %gewinner{"name"}.";

Mit Perl 5 ginge das nicht ansatzweise, weil perl die zweiten Anführungsstriche
als Textende ansieht, als Ende des Zustandes: "Ich lese gerade einen Text von
links nach rechts.". In Perl 6 werden jedoch zuerst die äußeren Anführungsstriche
als Begrenzung des auszugebenden Textes erkannt und danach die darin zu interpolierende
Hashvariable %gewinner, von der nur der Wert mit dem Schlüssel "name" gebraucht
wird.

Dies soll für einen ersten Rundgang genügen, durch die allgemeinen Grundlagen von
Perl 6. In der nächsten Folge werden Operatoren zur Veränderung und dem Vergleich
von Skalarwerten das Hauptthema sein.


Overview | Next Chapter


Upload Files

Click "Browse" to find the file you want to upload. When you click "Upload file" your file will be uploaded and added to the list of attachments for this page.

Maximum file size: 50MB

 
 
 
File Name Author Date Uploaded Size

Save Page As

Enter a meaningful and distinctive title for your page.

Page Title:

Tip: You'll be able to find this page later by using the title you choose.

Page Already Exists

There is already a page named XXX. Would you like to:

Save with a different name:

Save the page with the name "XXX"

Append your text to the bottom of the existing page named: "XXX"

Upload Files

Click "Browse" to find the file you want to upload. When you click "Add file" this file will be added to the list of attachments for this page, and uploaded when you save the page.

 
 
 
Add Tags

Enter a tag and click "Add tag". The tag will be saved when you save the page.

Tag: 

Suggestions: