Perl 6
Perl 6 Tutorial Part 1: Revision 19


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=.

Runde und geschweifte Klammern

Der nächste Schritt ist in Tutorials oftmals die Einführung von Variablen, denen
ein Wert zugewiesen wird, der gleich wieder ausgegeben wird.

my $a = 3;
say "Ich jongliere mit $a Bällen.";

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.

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.

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.

$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. Das gleiche Zeichen kann jetzt mehrere Operatoren darstellen, je nachdem, wie es von Leerzeichen umgeben ist:

++$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
$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:

@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, das 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:

my $a #( = 6; ) = 5; # es 5 wird zugewiesen
say "$a #(????) $a"; #( Ausgabe von '5 #`(????) 5'
keine Kommentare innerhalb von Strings )
$ape# .scream().look() # doesn't scream, just looking
@number#({ ?? ).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:

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: