Perl 6
Perl 6 Tutorial Part 1: Revision 38


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 specification (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 doesn't support every command. And 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 need a tutorial that introduces the reader slowly into the world of Perl 6 and requires 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. A start is made quickly, but it takes time to really learn Perl, and the new generation is optimized even on that.

Greetings Perl 6

Nearly every introduction starts with a "Hello World" example. I tried to come up with something more inventive, 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

To put more life into our program, lets use 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 = prompt "Some spare balls? ";
if $a > 2 { say "I juggle with $a balls." }

The promt is a handy shortcut that replaces 3 commands. It does say, reads from STDIN (now $*IN) and chomps (cutting trailing \n) the result. In Perl 6 all reading from a data stream gets autochomped. The space after "balls? " is left by intention so that the input doesn't clutch on the question output.

And also in the second line we see a pleasant difference from Perl 5. The term following the 'if' may, or may not be placed in parentheses. Parentheses are used in Perl 6 only for grouping. If we have no nested structure, but only a single statement or a simple sequence of statements, they are not needed. This is true everywhere. In a similar way, an array, a variable that stores multiple values, can now be fed without parentheses.

Perl 6:

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

This is possible because the comma is a list (creating) operator now. The second, not quite so obvious new feature in Perl 6, which is shown in the 'if' statement above, is the absence of a final semicolon. Since Perl 1.0, the semicolon separates individual commands. Only the last command within curly brackets (a block), does not have to end with a semicolon. Also you can see (above) you no longer have to remember when following when a closing brace has a semicolon. (These rules were largely taken from C), Larry has decided that each semicolon is optional after braces from now. For 'if' blocks the same is true in Perl 5, but not as in 'eval' blocks.

Perl 5:

eval { print "Find all 3 differences !\n" };

Perl 6:

try { say "Find all 3 differences!" }

The third difference is the 'try' command, because 'eval' accepts only strings as parameter. Use now 'try' if you need a trial execution of blocks where errors can't stop your program, but where you can analyze the during runtime.

A not so free format

In terms of formatting, Perl has become somewhat more stringent. Leading spaces cannot be inserted anywhere at will. Of course, the width of indentation, and in general the number of spaces and line breaks between two parts of an expression are irrelevant.

Perl 6:

$b = $a ; # assign a value
$c = $a; # now I still have a copy of the value
$d
=
$a
; # And even a

But spaces and line breaks are already a divisive issue for operators, you must now pay more attention. Especially the new prefix Operator ('='), which takes the part of the popular perl5 diamond operator ('<>'), and can easily be mistaken for an assignment. The following two instructions can cause confusion:

Perl 6: Perl 6:

$b = =$a; # assigning a line from a stream
$b == $a; # numeric comparison

The same character can now display multiple operators, depending on how it is surrounded by spaces:

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: