|
Perl 6
Perl 6 Tutorial Part 1: Revision 21
Motivation for a friendly Perl 6-TutorialPerl 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 6Nearly 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; 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 BracesThe next step in tutorials is often to introduce a variable, to which we assign assign a value and then reference: my $a = 3; 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;
Und hier sehen wir schon einen Unterschied zu Perl 5, der angenehm auffällt. my @primzahlen = 2,3,5,7;
Dies ist auch möglich, weil das Komma jetzt ein listenerzeugender Operator ist. Die 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 Ein nicht mehr ganz so freies FormatIn 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 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 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 ]; 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 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 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. |