Larry Wall gibt den Rakudo-Perl-6-Compiler auf MoarVM für den produktiven Einsatz frei

Seite 2: Einstieg

Inhaltsverzeichnis

Perl 6 ist tatsächlich deutlich einsteigerfreundlicher als Perl 5. use strict und warnings sind ohne Zutun aktiviert und die Fehlermeldungen beschreiben auftretende Probleme genauer. Bei kleineren Schreibfehlern kennen sie den tatsächlichen Namen einer Variable oder Methode. Rakudo erkennt mitunter die Anwendung eines Perl-5-Idioms und schlägt den passenden Ersatz vor.

Das Format ist immer noch frei: Leerzeichen und Zeilenumbrüche sind weitgehend Dekoration – ; oder {} trennen Befehle. An unsinnigen Stellen sind Leerzeichen allerdings verboten und müssen maskiert werden: %var\ {$i} statt %var {$i}).

Signaturen und Objekte funktionieren grundlegend wie im Java- und JavaScript-Universum:

    my $objekt = Klasse.new(...) # oder
my $objekt = $anderesobjekt.clone(...)

Die Schlüsselwörter class und method tun das Erwartete, weichen aber in Details von dem ab, was man von Moose her kennt.

Variablen ändern nicht mehr ihre Sigil je nach Kontext. Wer $, @ und % zu viel des Guten findet, kann jeden Variablenamen mit $ starten – auch Arrays und Hashes. Das funktioniert, weil Skalare Container sind, die jedes Objekt aufnehmen können – inklusive anderer Container. Deshalb entfällt auch lästiges Dereferenzieren wie @{ $arrayref[3]{'subscript'} }. Stattdessen heißt es: $arrayref[3]<subscript>.flat). <...> an Stelle von {'...'} zu setzen (beides ist möglich), ist nicht nur etwas kürzer und optisch klarer, sondern auch konsistent innerhalb der gesamten Syntax. Spitze Klammern sind die neue, alternative Schreibweise für qw(...). %hash<sub script> entspricht deshalb %hash{'sub','script'}, was in Perl 5 @hash{'sub','script'} war.

Bis auf die Ausnahmen ($_ $/ und $!) gibt es keine Spezialvariablen mit Sonderzeichen oder Token (__FILE__) mehr. Sie haben jetzt ausgeschriebene Namen wie $*PERL (Perlversion, ehemals $], $^V) oder $?FILE und eine sekundäre Sigil mit eigenem Namensraum. Daher kollidieren sie nicht mehr so leicht mit den Nutzervariablen. Besonders die von sort verwendeten $a und $b waren berüchtigte Fußangeln. Jetzt heißen sie $^a und $^b. Selbst die Kontextvariable $_ ersetzt fehlende Parameter nur noch auf sichtbaren Wunsch: .say statt say.

Dank say und prompt betreiben Anfänger Shell-IO, ohne über Zeilenumbrüche, chomp oder $/ nachzudenken.

    my $antwort = prompt 'Frage ? ';

Einfacher File-IO verzichtet sogar auf Datei-Handles:

    my $inhalt = slurp 'datei.txt';   # lesen
spurt('datei.txt', $inhalt); # schreiben, Klammern optional

Sehr viele Perlskripte durchforsten zeilenweise Logdateien:

   for 'log.txt'.IO.lines -> $line { .... # die runden Klammern nach for 
# sind optional

Da Listen ohne den Zusatz eager faul(lazy) sind, liest Perl die nächste Zeile erst vom Datenträger, wenn der Schleifendurchgang ansteht. IO ist eine Methode der Klasse Cool (Oberklasse aller Strings und Zahlen), die wie open ein IO::Path-Objekt (file-handle-Nachfolger) erzeugt. Die ->-Syntax nennt sich pointy Block und ist eine Kurzschreibweise für einfache Signaturen, welche natürlich mehrere Parameter beinhalten können. Diese werden bei jedem Schleifendurchgang mit den nächsten Werten aufgefüllt. Das folgende Beispiel zeigt die Iteration über Wortpaare aus der Datei, über zwei parallele Arrays und über Schlüssel-Wert-Paare eines Hashes:

   for 'log.txt'.IO.words -> $wordl, $wordr { ...
for zip(@l, @r) -> ($l, $r) { ... # zip-Befehl
for @l Z @r -> ($l, $r) { ... # mit dem zip-Operator
for %hash.kv -> $key, $value{ ... # .kv gibt eine flache Liste
# Laufvariablen geklammert, da zip list of list (Tupel) erzeugt

Für eine bessere Klarheit besitzt jedes Sprachelement nur noch eine Bedeutung. for läuft immer Listen ab – eine altgediente Schleife im C-Stil bekommt man mit:

    loop (my $i = 0; $i < 100; $i++){ ... # in dem Fall besser: for ^100 -> $i

loop {... ist auch weniger missverständlich als das ominöse while(1){....