<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule">

<channel>
<title><![CDATA[Perl 6: Tutorial]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?action=weblog_display;category=Tutorial</link>
<description></description>
<pubDate>Wed, 19 Jan 2011 16:47:49 -0000</pubDate>
<webMaster>synedra@gmail.com</webMaster>
<generator>Socialtext Workspace v2.14.7.2</generator>

<item>
<title><![CDATA[Perl 6 Tutorial Part 1]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_1</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#motivation_for_a_friendly_perl_6_tutorial">Motivation for a friendly Perl 6 tutorial</a><!-- wiki: {link: [] Motivation for a friendly Perl 6 tutorial} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#greetings_perl_6">Greetings Perl 6</a><!-- wiki: {link: [] Greetings Perl 6} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#parentheses_and_curly_braces">Parentheses and Curly Braces</a><!-- wiki: {link: [] Parentheses and Curly Braces} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#a_not_so_free_format">A not so free format</a><!-- wiki: {link: [] A not so free format} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#noch_kommentare">noch Kommentare?</a><!-- wiki: {link: [] noch Kommentare?} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#setz_es_in_anf_C3_BChrungszeichen">Setz es in &quot;Anführungszeichen&quot;</a><!-- wiki: {link: [] Setz es in "Anführungszeichen"} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><h3 id="motivation_for_a_friendly_perl_6_tutorial">Motivation for a friendly Perl 6 tutorial</h3>
<p>
Perl 6 appears slowly before the wondering eyes of the curious, but if they grab <a href="http://www.perlfoundation.org/perl6/index.cgi?rakudo" title="(40 months) The Rakudo Perl 6 Compiler http rakudo.org ( rakudo for short) targets the Parrot Virtual Machine [P...">Rakudo</a> and the <a href="http://www.perlfoundation.org/perl6/index.cgi?specification" title="(40 months) Unless Perl 5, where the interpreter IS the de-facto specification, Perl 6 has the advantage of clea...">specification</a> (aka <a href="http://www.perlfoundation.org/perl6/index.cgi?synopses" title="(39 months) The Synopses are the (almost) human readable documents which constantly kept up to date, (unlike oth...">Synopses</a>) 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.</p>
<h3 id="greetings_perl_6">Greetings Perl 6</h3>
<p>
Nearly every introduction starts with a &quot;Hello World&quot; 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:</p>
<blockquote>
v6;<br />
say &quot;Greetings, earthlings, err Perl 6 neophytes.&quot;;</blockquote>
<br /><p>
This first program outputs the expected text. The command <tt>say</tt> corresponds to the familiar <tt>print</tt>, 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 <tt>print</tt> command is still available, but the new idiom is to use <tt>say</tt>.</p>
<p>
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:</p>
<p>
Perl 5:</p>
<blockquote>
use strict;<br />
use warnings;</blockquote>
<br /><blockquote>
print &quot;Greetings, earthlings, err Perl 6 neophytes.\n&quot;;</blockquote>
<br /><p>
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 <tt>no strict</tt> or <tt>no warnings</tt>.</p>
<h3 id="parentheses_and_curly_braces">Parentheses and Curly Braces</h3>
<p>
To put more life into our program, lets use a variable, to which we assign a value and then reference:</p>
<blockquote>
my $a = 3;<br />
say &quot;I juggle with $a balls.&quot;;</blockquote>
<br /><p>
We see that scalars still contain a single value (of any data type) and still use the sigil <tt>$</tt>. There's nothing more to explain. The variable is declared with <tt>my</tt> in the familiar lexical local scope, since <tt>use strict</tt> is in effect. And the double quote works basically as in Perl 5, interpolating control chars and variables. Perhaps playing with one or two balls shouldn't be called juggling:</p>
<blockquote>
my $a = prompt &quot;Some spare balls? &quot;;<br />
if $a &gt; 2 { say &quot;I juggle with $a balls.&quot; }</blockquote>
<br /><p>
The <tt>promt</tt> is a handy shortcut that replaces 3 commands. It does <tt>say</tt>, reads from <tt>STDIN</tt> (now $*IN) and chomps (cutting trailing \n) the result. In Perl 6 all reading from a data stream gets autochomped. The space after &quot;balls? &quot; is left by intention so that the input doesn't clutch on the question output.</p>
<p>
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.</p>
<p>
Perl 6:</p>
<blockquote>
my @primes = 2,3,5,7;</blockquote>
<br /><p>
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 a semicolon is following a closing brace. (These rules were largely taken from C.) Larry has decided that each semicolon after braces is from now on optional. For 'if' blocks the same is true in Perl 5, but not as in 'eval' blocks.</p>
<p>
Perl 5:</p>
<blockquote>
eval { print &quot;Find all 3 differences !\n&quot; };</blockquote>
<br /><p>
Perl 6:</p>
<blockquote>
try { say &quot;Find all 3 differences!&quot; }</blockquote>
<br /><p>
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.</p>
<h3 id="a_not_so_free_format">A not so free format</h3>
<p>
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.</p>
<p>
Perl 6:</p>
<blockquote>
$b = $a ; # assign a value<br />
$c = $a; # now I still have a copy of the value<br />
$d<br />
= <br />
$a <br />
; # And even a</blockquote>
<br /><p>
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 ('&lt;&gt;'), and can easily be mistaken for an assignment. The following two instructions can cause confusion:</p>
<p>
Perl 6: Perl 6:</p>
<blockquote>
$b = =$a; # assigning a line from a stream<br />
$b == $a; # numeric comparison</blockquote>
<br /><p>
The same character can now display multiple operators, depending on how it is surrounded by spaces:</p>
<p>
Perl 6:</p>
<p>
 ++$b # Präfix-Operator, Autoinkrement vor Evaluierung<br />
 $b++ # Postfix-Operator, Autoinkrement nach Evaluierung<br />
 +$a # Präfix-Operator, das selbe wie num $a, ähnlich int $a<br />
 $a + $b; # Infix-Operator, Addition<br />
 =$b # Präfix-Operator, Zeile aus einem Datenstrom<br />
 $a = $b; # Infix-Operator, Zuweisung<br />
 <a href="http://www.perlfoundation.org/perl6/index.cgi?%24a" title="[click to create page]" class="incipient">$a</a> # Circumfix-Operator, Teilarray oder Reduktionsoperator<br />
 &lt; $a&gt; # Circumfix-Operator, qw()<br />
 &lt;&lt; $a &gt;&gt; # Circumfix-Operator, interpolierendes qw()</p>
<p>
Diese Unterscheidungen sind nicht gänzlich neu, da beide Arten des Autoinkrementes<br />
schon in C bekannt sind. Unerwartete Probleme kann es für Umsteiger aber auch beim<br />
Schreiben von Arrays, Hashes und von Objekten geben. Folgende Schreibweisen werden<br />
nicht mehr erkannt:</p>
<p>
Perl 5:</p>
<p>
 $array <a href="http://www.perlfoundation.org/perl6/index.cgi?%24i" title="[click to create page]" class="incipient">$i</a>;<br />
 $hash {$k};<br />
 $obj -&gt; methode ();</p>
<p>
Wer seinen Quellcode so formatieren möchte, daß bestimmte Teilausdrücke oder die<br />
Zeilenenden genau untereinander stehen, braucht in Perl 6 die &quot;long dot&quot; genannte<br />
Schreibweise:</p>
<p>
Perl 6:</p>
<p>
 @array\ .<a href="http://www.perlfoundation.org/perl6/index.cgi?%24i" title="[click to create page]" class="incipient">$i</a>; # ein Wert aus einem Array<br />
 %hash\ .{ $k }; # ein Wert aus einem Hash<br />
 $obj\ # ich kann auch Kommentare einfügen<br />
 .methode ( ) ; # manche Leerzeichen sind erlaubt</p>
<p>
Blitzmerker haben aus diesem Code bereits geschlossen, daß Arrays nun immer mit<br />
'@' anfangen, Hashes nun immer mit '%' und das der Punkt das Objekt und den Namen<br />
der Methode trennt, wozu früher ein Pfeil ('-&gt;') diente (z.B.:'$obj.methode()').<br />
Daß der Backslash ('\') die nachfolgenden Leerzeichen und Zeilenumbrüche &quot;quotet&quot;,<br />
also ihrer normalen Bedeutung enthebt, ist auch nichts wirklich Ungewöhnliches.<br />
Das Stirnrunzeln beim Betrachter dieser Zeilen erwarte ich erst, sobald sein Hirn<br />
diese beiden Gedanken verbindet und die Frage auftaucht: Der Sliceoperator (die<br />
Klammern hinter einer Variable, mit deren Hilfe wir einzelne Werte, also Teile<br />
(slices), eines Arrays oder Hashes geliefert bekommen) ist doch nicht ernsthaft<br />
eine Methode des Objektes vom Typ Array oder Hash? Doch, ist es. Perl 6 ist so<br />
objektorientiert wie Ruby, auch wenn es sein möglichstes tut, daß vor dem Benutzer<br />
zu verbergen. Zum Beispiel dadurch, in dem es oftmals den Punkt optional läßt.<br />
Statt dem auch möglichen '@array.<a href="http://www.perlfoundation.org/perl6/index.cgi?3" title="[click to create page]" class="incipient">3</a>' reicht wie gewohnt ein '@array[3]'. Nur in<br />
diesem Sonderfall, wenn man zwischen Objekt und Methode Leerzeichen einfügen will,<br />
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.</p>
<h3 id="noch_kommentare">noch Kommentare?</h3>
<p>
In allen bisherigen Beispielen war es zu sehen: Wie aus Perl 5, anderen Sprachen<br />
und Unix-Shells bekannt, leitet auch in Perl 6 die Raute ('#') einen Kommentar<br />
ein, der mit der selben Zeile endet. Neu in Perl sind jedoch Kommentare, deren<br />
Ende sich bestimmen läßt. Diese können mitten in eine Zeile eingefügt werden oder<br />
sich über mehrere Zeilen erstrecken. Solche Kommentare beginnen auch mit einer<br />
Raute, der jedoch unmittelbar eine Klammer folgt. Als Klammern gelten die Zeichen<br />
'()', '[]','{}' und '&lt;&gt;', wobei natürlich die zugehörige schließende Klammer den<br />
Kommentar beendet. Dabei kann man stets die Klammern wählen, die sich optisch vom<br />
Quellcode abheben. Dies kennt man in Perl 5 schon von den Regulären Ausdrücken<br />
und vom Quoting, aber zur Verdeutlichung einige Beispiele:</p>
<p>
Perl 6:</p>
<p>
 my $a #( = 6; ) = 5; # es 5 wird zugewiesen<br />
 say &quot;$a #(????) $a&quot;; #( Ausgabe von '5 #(????) 5'<br />
 keine Kommentare innerhalb von Strings )</p>
<p>
 $affe# <span class="nlw_phrase">.schreit()<!-- wiki: {{.schreit()}} --></span>.guckt() # der schreit nicht, der guckt nur<br />
 @zahlen#({ ?? ).reverse; reingefallen alles noch Kommentar<br />
 }).sort; # gibt sortierte Version des Arrays zurück</p>
<p>
Die letzten beiden Beispiele zeigen, daß mehrere Klammern benutzt werden dürfen.<br />
Dabei hat man nur darauf zu achten, beim Abschließen des Kommentars genau die<br />
passende Art, Anzahl und Reihenfolge der Klammern zu verwenden. Manche mögen darin<br />
wieder neue Wege sehen, unleserlichen Quelltext zu schreiben, aber hinter dem<br />
Vorgestelltem steht vor allem eine neue Arbeitslogik des Perlinterpreters, die<br />
einige aufdringliche und einige leicht zu übersehende Problemfälle bereinigt.</p>
<h3 id="setz_es_in_anf_C3_BChrungszeichen">Setz es in &quot;Anführungszeichen&quot;</h3>
<p>
Mit der Arbeitslogik meine ich das &quot;one-pass parsing&quot;, zu deutsch: ein Interpreter<br />
kann in einem Durchgang den Code vollständig erfassen. Mit Perl 5 ist das leider<br />
anders. Hier schaut der aufgebohrte Bison-Parser öfters vor und zurück, um zu<br />
erkennen, was der Programmierer grad von ihm möchte und wechselt dabei zwischen<br />
verschiedenen Zuständen, wie etwa: &quot;Dies ist Kommentar&quot;, oder &quot;Dies ist gerade<br />
eine Anweisung&quot;. Perl 6 kennt nicht die Sonderregeln und Doppeldeutigkeiten,<br />
welche dies notwendig machten. Das macht die Interpreter nicht nur schlanker und<br />
schneller, sondern auch narrensicherer. Beim Einlesen kann ein Perl 6-Interpreter <br />
die Quellen in immer kleinere Bedeutungseinheiten aufspalten. Selbst wenn eine<br />
dieser Bedeutungseinheiten keinen Sinn ergibt (eine Katze über die Tastatur lief),<br />
beeinträchtigt dies nicht den Rest des Programmes. Ein Perl 5-Beispiel mit einer<br />
Regex, die mit Kommentaren versehen ist zeigt, welche hinterhältigen Fehler die<br />
alte Lesart bisher erlaubte:</p>
<p>
Perl 5:</p>
<p>
 / ( # begin der capture<br />
 \w+ # Buchstaben und / oder Zahlen<br />
 | # nächste Alternative<br />
 ...<br />
 ) /x;</p>
<p>
Der Slash ('/') im Kommentar läßt perl vermuten, hier sei die Regex zu Ende und<br />
wird vom Nachfolgendem sehr sehr verwirrt. In Perl 6 haben Kommentare keinen<br />
Einfluß mehr auf Anweisungen und auch Dokumentation (POD) kann überall eingefügt<br />
werden, ohne daß es mißverstanden wird. Auch öffnende Klammern, denen ihr Gegenstück<br />
fehlt, werden in Perl nun wohlwollend übergangen. Allerdings ist im täglichen<br />
Gebrauch vor allem folgende Konsequenz dieser Technik wirklich praktisch:</p>
<p>
Perl 6:</p>
<p>
 say &quot;Und der Gewinner ist %gewinner{&quot;name&quot;}.&quot;;</p>
<p>
Mit Perl 5 ginge das nicht ansatzweise, weil perl die zweiten Anführungsstriche<br />
als Textende ansieht, als Ende des Zustandes: &quot;Ich lese gerade einen Text von<br />
links nach rechts.&quot;. In Perl 6 werden jedoch zuerst die äußeren Anführungsstriche<br />
als Begrenzung des auszugebenden Textes erkannt und danach die darin zu interpolierende<br />
Hashvariable %gewinner, von der nur der Wert mit dem Schlüssel &quot;name&quot; gebraucht<br />
wird.</p>
<p>
Dies soll für einen ersten Rundgang genügen, durch die allgemeinen Grundlagen von<br />
Perl 6. In der nächsten Folge werden Operatoren zur Veränderung und dem Vergleich <br />
von Skalarwerten das Hauptthema sein.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(39 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_2" title="(34 months)  toc Perl is an operator based language Unlängst konnte ich herzlich lachen, als ich diesen Satz in ...">Next Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 2 --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_1</guid>
<pubDate>Wed, 19 Jan 2011 16:47:49 -0000</pubDate>
</item>

<item>
<title><![CDATA[Perl 6 Tutorial Part 7]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_7</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#text_rules_and_grammars">Text, Rules and Grammars</a><!-- wiki: {link: [] Text, Rules and Grammars} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#es_werde_string">Es werde String</a><!-- wiki: {link: [] Es werde String} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#einfaches_quoting">Einfaches Quoting</a><!-- wiki: {link: [] Einfaches Quoting} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#komplexeres_quoting">Komplexeres Quoting</a><!-- wiki: {link: [] Komplexeres Quoting} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#heredocs">Heredocs</a><!-- wiki: {link: [] Heredocs} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#die_neuen_regex">Die neuen Regex</a><!-- wiki: {link: [] Die neuen Regex} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#regex_optionen">Regex Optionen</a><!-- wiki: {link: [] Regex Optionen} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#quanto_costa">Quanto costa?</a><!-- wiki: {link: [] Quanto costa?} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#nichts_ist_illegal">Nichts ist illegal</a><!-- wiki: {link: [] Nichts ist illegal} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#wendeh_lse">Wendeh�lse</a><!-- wiki: {link: [] Wendeh�lse} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#die_gro_e_perpektive">Die gro�e Perpektive</a><!-- wiki: {link: [] Die gro�e Perpektive} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><h3 id="text_rules_and_grammars">Text, Rules and Grammars</h3>
<p>
Willkommen zum siebenten Teil dieses poetischen Perl 6-Tutorials, da� vor allem<br />
den Umgang mit Text, also Strings, zum Inhalt hat. Das klingt stark nach Regex,<br />
beinhaltet aber noch einiges mehr, wie I&lt;quoting&gt;, Interpolation und Formate.<br />
Beginnen wir jedoch mit den einfachsten Grundlagen.</p>
<h3 id="es_werde_string">Es werde String</h3>
<p>
Wie im zweiten Kapitel beschrieben, ist f�r Perl 6, ebenso wie in Perl 5, String<br />
nur ein Kontext, in den beliebige Daten umgewandelt werden k�nnen. Dieser Kontext<br />
wird aber nicht nur mit Operatoren erzeugt die mit C&lt;~&gt; beginnen, sondern auch<br />
wenn ein Text ganz einfach in Anf�hrungszeichen in den Quellcode eingef�gt wird.</p>
<h3 id="einfaches_quoting">Einfaches Quoting</h3>
<p>
Die schlichte Variante sind dabei (wie bekannt) die einfachen Anf�hrungszeichen,<br />
innerhalb derer jedes Zeichen w�rtlich (I&lt;literal&gt;) verstanden wird und besondere<br />
Bedeutungen aufgehoben sind. Die einzigen beiden Ausnahmen sind C&lt;\'&gt; und C&lt;\\&gt;.<br />
Ersteres ist notwendig um ein einfaches Anf�hrungszeichen innerhalb des Strings<br />
zu erhalten, zweiteres f�r einen umgekehrten Schr�gstrich (I&lt;Backslash&gt;), der <br />
normalerweise die besondere Bedeutung der Steuerzeichens (Metazeichens) aufhebt,<br />
was auch I&lt;escapen&gt; genannt wird. Etwas in Anf�hrungszeichen zu setzten wird <br />
auch I&lt;quoting&gt; (Zitieren) bezeichnet, weswegen ein C&lt;q//&gt; die generalisierte<br />
Form von C&lt;''&gt; ist.</p>
<p>
	say '\''; # sagt: '<br />
	say q/\\/; # sagt: \<br />
	say q[&quot;\\&quot;]; # dito, beliebige Klammern sin m�glich</p>
<p>
Das sch�ne an Perl 6 ist allerdings nicht nur da� es sich hier bequem an Perl 5<br />
angleicht, sondern da� das Bekannte (oft) zur allgemeing�ltigen Grundregeln wird.<br />
C&lt;''&gt; hat �berall die gleiche Bedeutung, auch innerhalb eines regul�ren Ausdrucks.<br />
Und C&lt;q//&gt; ist die Basis s�mtlicher I&lt;quoting&gt;-Operatoren die lediglich C&lt;q//&gt; mit<br />
verschiedenen Optionen aufrufen. Aber um wirklich ehrlich zu sein: auch das ist<br />
nur die halbe Wahrheit. Die echte Urvater aller I&lt;quoting&gt;-Operatoren ist das<br />
C&lt;Q&gt;, welches gar nichts interpoliert und C&lt;q//&gt; ist ein I&lt;Alias&gt; auf C&lt;Q :q //&gt;.<br />
Der Doppelpunkt vor dem &quot;q&quot; markiert einen benannten Parameter. Die ganze <br />
Erkl�rung dazu steht in der vierten und f�nften Folge.</p>
<h3 id="komplexeres_quoting">Komplexeres Quoting</h3>
<p>
Auch wenn die Einfachen oft ausreichend sind und minimal Rechenzeit sparen,<br />
so sieht man �fter die doppelten Anf�hrungszeichen. Ihre Bedeutung blieb auch<br />
im Wesentlichen unber�hrt. Innerhalb von C&lt;&quot;&quot;&gt; werden Variablen evaluiert (durch<br />
ihren Inhalt ersetzt) und I&lt;Escapesequenzen&gt; wie C&lt;\n&gt; (Zeilenende) oder C&lt;\t&gt;<br />
(Tab) gegen entsprechende Sonder- oder Steuerzeichen ersetzt. Hinzu kam die an<br />
Ruby erinnernde M�glichkeit, neben Subroutinen (hier mit &quot;&amp;&quot; schreiben) nun auch <br />
Bl�cke (I&lt;Closures&gt;) auszuf�hren.</p>
<p>
	say &quot;Und die Zusatzzahl f�r $heute lautet: \t { int rand(47) }.&quot;;</p>
<p>
Auch hier hat Larry konsequent vereinheitlicht. Bl�cke werden nun mal (wenn sie<br />
kein Parameter sind) sofort ausgef�hrt. Und auch wer jetzt innerhalb einer Regex<br />
etwas ausf�hren m�chte sollte sich dieses Mittels bedienen anstatt sich mit der<br />
Option &quot;e&quot; oder C&lt;(?{ ... })&gt; einen Kompilererror einzufangen. Anstatt &quot;ee&quot; l��t<br />
sich ein C&lt;eval&gt; in den Block einf�gen (Ausf�hrung des Ausf�hrungsergebnisses).</p>
<p>
Damit ist eindeutig klar: C&lt;&quot;&quot;&gt; oder alternativ auch C&lt;qq//&gt; ist ein I&lt;Alias&gt; auf<br />
C&lt;Q :s :a :h :f :c :b //&gt;, oder? Verst�ndlicher wird es, wenn die &quot;langen Formen&quot;<br />
der &quot;Adverbien&quot; verwendet werden (C&lt;Q :scalar :array :hash :function :closure <br />
:backslash //&gt;). C&lt;:scalar&gt; besagt das Skalare evaluiert werde, C&lt;:array&gt; - Arrays<br />
... und C&lt;:backslash&gt; bezieht sich auf die Steuerzeichen. Das impliziert auch <br />
C&lt;:q&gt; aka C&lt;:single&gt;, da� hierf�r nicht extra angegeben werden mu�te. C&lt;:qq&gt; <br />
lautet ausgeschrieben entsprechend C&lt;:double&gt;. Weitere I&lt;quote&gt;-&quot;Adverbien&quot; sind <br />
C&lt;:x&gt; aka C&lt;:exec&gt;, was dem bekannten Perl 5-C&lt;qx&gt; entspricht, nur das C&lt;qx&gt; in <br />
Perl 6 logischerweise nicht interpoliert, da es gleich C&lt;q :x //&gt; ist. C&lt;:w&gt; aka<br />
C&lt;:words&gt; ist ebenfalls altbekannt, wird aber in Perl 6 idiomatisch &quot;&lt; &gt;&quot; <br />
geschrieben (siehe dritte Folge). <br />
C&lt;:ww&gt; aka C&lt;:quotewords&gt; entspricht dem bereits bekannten &quot;&lt;&lt; &gt;&gt;&quot;.</p>
<p>
	my $ich = 'Prinz';<br />
	my @n = 1 .. 5;<br />
	say q:a/$ich sage: in \@n ist @n./<br />
	# sagt: $ich sage: in @n ist 1 2 3 4 5.</p>
<h3 id="heredocs">Heredocs</h3>
<p>
I&lt;Heredocs&gt; sind nun auch nichts besonderes (eigenst�ndiges) mehr, nur noch normale<br />
I&lt;quotings&gt;, deren Ende mit einer definierten Zeichenkette markiert ist. Diese<br />
kann nun beliebig einger�ckt sein. I&lt;Heredocs&gt; werden damit weit m�chtiger, ohne<br />
erh�hten Lernaufwand.</p>
<p>
	my $letter = qq:to/END/<br />
		Dear $recipient:<br />
		Thanks!<br />
		Sincerely,<br />
		$me<br />
		END</p>
<p>
Die Langform des C&lt;:to&gt;-Adverbs ist C&lt;:heredoc&gt;.</p>
<h3 id="die_neuen_regex">Die neuen Regex</h3>
<p>
Es gibt von diesen Adverbien noch einige mehr, diese haben jedoch nur eine lange<br />
Form und nicht mehr direkt etwas mit Strings zu tun, da sie zu Code oder Regex<br />
evaluiert werden. Denn Regul�re Ausdr�cke werden in Perl 6 nicht mehr als Strings<br />
angesehen, sondern als eigenst�ndige Sprache innerhalb der Sprache (wie in Rebol).<br />
Diese Sprache ist kontextfrei, was rekursive Ausdr�cke erlaubt, wie erst seit <br />
Perl 5.10 m�glich. Und diese Sprache unterscheidet sich teilweise so stark von den<br />
Regex in Perl 5, da� eine Zeit lang f�r sie ein neuer Begriff gepr�gt wurde (die<br />
Perl &quot;rules&quot;). Somit wandelte sich der Ausdruck &quot;Perl rules&quot; von einer Angeberei<br />
zur Erw�hnung einer normalen Tatsache. Mittlerweile setzte sich aber auch f�r die<br />
neuen Regeln der Begriff Regex wieder durch.</p>
<p>
Es war n�tig sie von Grund auf neu zu gestalten, da der Regex-Syntax mit der Zeit<br />
zu un�bersichtlich und widerspr�chlich wurde. Dies war auch nur teilweise das <br />
Verschulden von Larry oder Ilya, da viele Unsauberheiten der UNIX-Kultur<br />
entstammen. Damals schien es noch eine gute Idee sich an die Standards zu halten<br />
und Perl leicht erlernbar zu machen. Mittlerweile hat Perl selbst den Standard<br />
gesetzt (PCRE) und es wird Zeit hier einiges gerade zu r�cken.</p>
<p>
Eine Regex kann mit drei Schreibweisen in einem Skalar gespeichert werden:</p>
<p>
	my $rx = rx[abc];<br />
	my $rx = q:regex[abc];<br />
	my $rx = regex{abc};</p>
<p>
Die dritte Variante ist aber nicht ganz das Selbe wie die ersten Beiden und kann<br />
daher nur ausschlie�lich mit geschweiften Klammern geschrieben werden. Mehr dazu<br />
wenn es um &quot;Grammatiken&quot; geht. Diese Skalare &quot;wissen&quot; ob sie ein Regexobjekt oder<br />
einen einfachen String enthalten und deshalb wird die Schreibweise C&lt;\Q$var\E&gt;<br />
�berfl�ssig. Auch ohne ihr w�rde eine Regex die aus Teilausdruck und einem String<br />
wie folgende funktionieren.</p>
<p>
	$text ~~ m/ $rx $str /;</p>
<p>
Oft werden Regex nicht gespeichert sondern direkt angewendet, was immer noch mit<br />
C&lt;m/.../&gt; oder C&lt;s/.../.../&gt; oder den Sonderformen C&lt;mm/.../&gt; und C&lt;ss/.../.../&gt;<br />
getan wird. Auch C&lt;tr/.../.../&gt; gibt es weiterhin. <br />
Diese Operationen werden wie in Perl 5.10 mit dem I&lt;Smartmatch&gt; (~~) an einen <br />
String gebunden. Das Resultat ist allerdings hier ein I&lt;Matchobjekt&gt;, da� im<br />
boolschen Kontext zu C&lt;Bool::True&gt; oder C&lt;Bool::False&gt; evaluiert, damit C&lt;if&gt;,<br />
C&lt;when&gt;, C&lt;while&gt; und C&lt;until&gt;, die diesen Kontext erzwingen, weiterhin arbeiten.<br />
Das zuletzt im aktuellen Block erzeugte I&lt;Matchobjekt&gt; liefert auch die Variable<br />
C&lt;$/&gt;, die alle Detailinformationen enth�lt. Andere, bisherige Sondervariablen<br />
wurden abgeschafft. Allerdings sind C&lt;$0&gt; bis C&lt;$9&gt; I&lt;Aliase&gt; auf C&lt;$/0&gt; bis<br />
C&lt;$/<a href="http://www.perlfoundation.org/perl6/index.cgi?9" title="[click to create page]" class="incipient">9</a>&gt;. Als Trenner k�nnen weiterhin beinah beliebige Zeichen verwendet werden.<br />
Aber Optionen werden nun (wie beim I&lt;quoting&gt;) als Adverbien vor die Trenner und<br />
hinter den Namen der Operation gesetzt.</p>
<h3 id="regex_optionen">Regex Optionen</h3>
<p>
	my $text = &quot;Ich schreibe gerne udn schnell udn viel.&quot;;<br />
	$text ~~ s:g/udn/und/;</p>
<p>
Ansonst sollte die Option &quot;:g&quot; bekannt sein. Ohne sie wird nur einmal ersetzt,<br />
mit ihr, jedes Aufkommen. Auch die &quot;:i&quot;-Option, welche die Gross/Kleinschreibung<br />
ignorieren l��t ist unver�ndert geblieben. �hnlich wie beim I&lt;quoting&gt; gibt es<br />
auch hier f�r die ordentlichen Sch�nschreiber mit C&lt;:global&gt; und C&lt;:ignorecase&gt;<br />
eine lange Version dieser Optionsnamen. Neu ist das Adverb C&lt;:ii&gt; aka C&lt;:samecase&gt;<br />
welches ebenfalls die Gro�/Kleinschreibung des Suchausdrucks nicht genau nimmt,<br />
ihn aber dann an die Schreibweise des Ersetzten anpasst.</p>
<p>
	my $text = &quot;Ale V�gel sind schon da, ale ...&quot;;<br />
	$text ~~ s:g:ii/ale/alle/;<br />
	# $text eq &quot;Alle V�gel sind schon da, alle ...&quot;</p>
<p>
In �hnlicher Weise gibt es nun auch C&lt;:a&gt; aka C&lt;:ignoreaccent&gt;, sowie C&lt;:aa&gt; aka <br />
C&lt;:sameaccent&gt; das Buchstaben als gleich erkennen und ersetzen k�nnen, egal ob<br />
sie einen Punkt, einen Strich, ein Dach oder nichts �ber sich haben. Dazu ignoriert<br />
der Interpreter alle &quot;I&lt;mark characters&gt;&quot; zusammengesetzter I&lt;Unicode&gt;-Zeichen.</p>
<p>
Es kamen etliche weitere Adverbien hinzu aber es wurden auch viele abgeschafft.<br />
Neben den bereits erw�hnten C&lt;:e&gt; und C&lt;:ee&gt; betrifft das auch C&lt;:m&gt; und C&lt;:s&gt;.<br />
C&lt;^&gt; und C&lt;$&gt; bedeuten nun immer Anfang und Ende des Strings. <br />
C&lt;^^&gt; und C&lt;$$&gt; stehen f�r Anfang und Ende einer Zeile: Perl verwendet nat�rlich<br />
das eigene C&lt;\n&gt; um Zeilen zu unterscheiden, was immer erfolgreich sein sollte,<br />
egal auf welchem Betriebssystem das Programm gerade l�uft oder woher die Daten <br />
kommen. Ein C&lt;.&gt; bedeutet jetzt wirklich &quot;ein beliebiges Zeichen&quot;. Die alte<br />
Bedeutung (ein beliebiges Zeichen au�er \n) nennt sich jetzt konsequenterweise C&lt;\N&gt;,<br />
da gro�geschriebene Symbole f�r Zeichenklassen immer das Komplement�r zu ihrem<br />
kleingeschriebenen Pendanten sind.</p>
<p>
Auch die Option C&lt;:x&gt; ist weg, da Leerzeichen und Kommentare nun standardm��ig<br />
eingef�gt werden k�nnen, soweit keine besondere Regel etwas anderes vorschreibt.<br />
Der Syntax von Kommentaren ist innerhalb der Regex der Selbe wie au�erhalb. Eine<br />
Raute kommentiert bis zum Ende der Zeile, folgt der Raute beliebige Klammersymbole,<br />
gilt bis zum Schlie�en dieser Klammern der Inhalt der Regex als Kommentar.</p>
<p>
Eine der Regeln die Leerzeichen besondere Bedeutung geben k�nnen ist C&lt;:s&gt; aka<br />
C&lt;:sigspace&gt;. Wird sie gew�hlt, z�hlt jedes Leerzeichen als &quot;&lt;.ws&gt;&quot;, was grob<br />
mit C&lt;\s+&gt; (mehrere Leerzeichen verschiedenster Art) �bersetzt werden kann.<br />
Diese I&lt;sigspace&gt; findet Larry so bedeutend, da� C&lt;m:s/.../&gt; gleichbedeutend mit<br />
C&lt;mm//&gt; ist. Ein C&lt;ss/.../.../&gt; entspricht allerdings einem C&lt;s:ss/.../.../&gt;.<br />
C&lt;:ss&gt; aka C&lt;:samespace&gt; unterscheidet sich von C&lt;:sigspace&gt; nur insoweit, da�<br />
auch zwischen dem zweiten und dritten Trenner jedes Leerzeichen als &quot;&lt;.ws&gt;&quot; gilt.</p>
<p>
	my $lied = &quot;Der Mond\nist\taufgegangen ...&quot;;<br />
	ss/Mond ist aufgegangen/Plumssack geht im/;<br />
	# &quot;Der Plumssack\ngeht\tim&quot;.</p>
<p>
Sehr praktisch finde ich auch die Optionen C&lt;:c&gt; aka C&lt;:continue&gt; und C&lt;:p&gt; aka<br />
C&lt;:pos&gt;. Ersteres sucht ab einer Position, zweiteres nur an einer Position. Wird<br />
keine Zahl f�r die Position angegeben, so wird diese C&lt;$/.&gt; entnommen.</p>
<p>
	my $text = &quot;Vom Eise befreit sind Strom und B�che.&quot;<br />
	if $text ~~ m:c(3)/Eis/ {<br />
		# wird ausgef�hrt<br />
		...<br />
	if $text ~~ m:p(3)/Eis/ {<br />
		# wird nicht ausgef�hrt<br />
		...</p>
<p>
Was genau gez�hlt werden soll, kann mit den Adverbien C&lt;:bytes&gt;, C&lt;:codes&gt;<br />
(I&lt;Unicode codepoints&gt;), C&lt;:graphs&gt; und C&lt;:chars&gt; angegeben werden.</p>
<p>
Soll eine Ersetzung nur dreimal ausgef�hrt werden so hilft C&lt;:3x&gt; aka C&lt;:x(3)&gt;<br />
und falls nur der f�nfte Fund einer Suche interessiert, so steht dazu C&lt;:5th&gt;<br />
aka C&lt;:nth(5)&gt; bereit. C&lt;:1st&gt;, C&lt;:2nd&gt; und C&lt;:3rd&gt; sind Sonderformen die eine<br />
nat�rliche Ausdrucksweise erlauben sollen und auch I&lt;Junctions&gt; wie C&lt;nth(3|5|7)&gt;<br />
sind m�glich. Die Bedeutung runder Klammern hat sich nicht ver�ndert. Sie <br />
umschlie�en nach wie vor Teilausdr�cke, deren Fund bitte gespeichert werden soll.<br />
Teilausdr�cke deren Fund nicht interessiert werden jetzt in eckige Klammern<br />
gesetzt anstatt in C&lt;(?: ... )&gt;.</p>
<p>
	s:3rd/(\d+)/@data[$0]/;<br />
	# ist das selbe wie:<br />
	m/(\d+)/ &amp;&amp; m:c/(\d+)/ &amp;&amp; s:c/(\d+)/@data[$0]/;</p>
<p>
Die Regeln f�r die Nummerierung von C&lt;$0&gt; bis C&lt;$9&gt; haben sich auch ge�ndert, da<br />
bisher kleine �nderungen in der Regex manchmal zu viele Nachbesserungen in dem<br />
Code forderte, der diese Variablen auswertet, da eine ung�nstig gesetzte Klammer<br />
die Position aller anderen ver�ndert. Sind Klammern hintereinander wie in C&lt;()()&gt;,<br />
werden sie immer noch genauso gez�hlt. In einem Fall wie C&lt;(... (...) )&gt; w�re der<br />
Fund der inneren Klammer in C&lt;$0[0]&gt;.</p>
<p>
Was mich ebenfalls begeisterte sind die die neuen Optionen C&lt;:ov&gt; aka C&lt;:overlap&gt; <br />
und C&lt;:ex&gt; aka C&lt;:exhaustive&gt; die am besten an einem Beispiel verstanden werden.</p>
<p>
	$str = &quot;abracadabra&quot;;</p>
<p>
	if $str ~~ m:overlap/ a (.) a / {<br />
		@substrings = @@(); <br />
		# bracadabr cadabr dabr br<br />
	}<br />
	if $str ~~ m:exhaustive/ a (.?) a / {<br />
		say &quot;@()&quot;; <br />
		# br brac bracad bracadabr c cad cadabr d dabr br<br />
	}</p>
<p>
Da C&lt;$0&gt; bis C&lt;$9&gt; oft nicht reichen, gibt es C&lt;@()&gt;, der alle Funde enth�lt.<br />
Um das Suchverhalten zu steuern, kann auch die neue Option C&lt;:ratchet&gt; hilfreich<br />
sein, die jegliches I&lt;Backtracking&gt; verhindert. Das bedeutet, da� Perl den zu<br />
durchsuchenden String nur ein einziges mal von links nach rechts �berpr�ft und<br />
dabei niemals r�ckw�rts geht, selbst wenn in der Regex Alternativen formuliert<br />
sind die erfolgreich sein k�nnten wenn die Suche noch einmal begonnen w�rde.<br />
Das I&lt;Backtracking&gt; kann aber auch f�r einzelne Teilausdr�cke abgestellt werden,<br />
indem ihm ein C&lt;:&gt; nachgestellt wird (ehemals &quot;(?&gt; ...)&quot;).</p>
<h3 id="quanto_costa">Quanto costa?</h3>
<p>
Die sogenannten I&lt;quantifier&gt; haben sich kaum ver�ndert. C&lt;?&gt; steht immer noch<br />
daf�r den Teilausdruck nicht oder nur einmal zu finden, C&lt;+&gt; f�r einmal oder<br />
beliebig oft und C&lt;&gt; f�r keinmal oder beliebig oft. Auch die nicht gierigen<br />
I&lt;quantifier&gt; (C&lt;??, ?, +?&gt;) haben sich in Syntax und Semantik (Bedeutung) nicht<br />
ver�ndert. Nur exakte I&lt;quantifier&gt; werden anders geschrieben, da geschweifte<br />
klammern wie beschrieben immer Bl�cke darstellen. Die neue Schreibweise, der<br />
aufmerksame Leser ahnt es bereits, entstammt dem allgemeinem Perlsyntax. Wenn ein<br />
Multiplikationszeichen Wiederholungen bezeichnet, dann kann eine vierfache<br />
Wiederholung ja nur C&lt;**4&gt; lauten. Und darf sich ein Teilausdruck nur ein bis<br />
dreimal wiederholen so wird dies C&lt;()**1..3&gt; geschrieben.</p>
<h3 id="nichts_ist_illegal">Nichts ist illegal</h3>
<p>
Mit Perl 6 gibt sich Larry auch gro�e M�he Zweideutigkeiten zu vermeiden. Ein<br />
simples:</p>
<p>
	$text ~~ m/ /;</p>
<p>
wirft jetzt einen wundersch�nen Error in die Kommandozeile. Um die letztbenutze<br />
Regex wiederzuverwenden schreibe man:</p>
<p>
	$text ~~ m/ &lt;prior&gt; /;</p>
<p>
Oder falls tats�chlich nichts gesucht wird, gibt es die Schreibweisen C&lt;''&gt; und<br />
&quot;&lt;?&gt;&quot;. Wird eine Alternative beim Programmieren vergessen wird dies nun sofort<br />
sichtbar. Ja auch das C&lt;|&gt; hat sich in seiner Bedeutung nicht ver�ndert.</p>
<p>
	$text ~~ m/ <a href="http://www.perlfoundation.org/perl6/index.cgi?%7C_" title="[click to create page]" class="incipient">|_</a>+ /;</p>
<p>
Diese Regex sucht W�rter die aus Buchstaben und Unterstrichen bestehen. <br />
Was vorher Dach war (Komplement�rmenge an Zeichen) ist nun Minus. Oder anschaulich:<br />
Keine hexadezimale Zahlen, die man fr�her mit der Gruppe C&lt;<a href="http://www.perlfoundation.org/perl6/index.cgi?%5E0-9a-f" title="[click to create page]" class="incipient">^0-9a-f</a>&gt; erfasst hat,<br />
werden jetzt mit &quot;&lt;-<a href="http://www.perlfoundation.org/perl6/index.cgi?0-9a-f" title="[click to create page]" class="incipient">0-9a-f</a>&gt;&quot; gesucht. In diesem Falle w�rde es &quot;&lt;-hexdigit&gt;&quot;<br />
allerdings auch tun.</p>
<h3 id="wendeh_lse">Wendeh�lse</h3>
<p>
Vorschau (I&lt;lookahead&gt;) und R�ckschau (I&lt;lookbehind&gt;) haben ihre Schreibweise<br />
ge�ndert und sind nun lesbarer. Angelehnt an logische Operatoren wie den Tern�ren<br />
bezeichnet ein C&lt;?&gt; immer eine positive und C&lt;!&gt; eine negative Option. Folglich<br />
wurde C&lt;(?= ...)&gt; zu &lt;?before ...&gt; und C&lt;(?! ...)&gt; zu &lt;!before ...&gt;. Entsprechend<br />
�nderte sich C&lt;(?&lt;= ...)&gt; zu &lt;?after ...&gt; und C&lt;(?&lt;! ...)&gt; zu &lt;!after ...&gt;. Mit<br />
solchen Teilausdr�cken verlangt man welche Zeichen vor oder hinter dem gesuchten<br />
Teilstring gew�nscht oder unerw�nscht sind. Eine detaillierte Erkl�rung dazu hat<br />
das perlretut in den I&lt;perldocs&gt;.</p>
<p>
Wer sp�testens jetzt bei all den Neuerungen und �nderungen die Lust verliert, <br />
kann mit C&lt;:P5&gt; aka C&lt;:Perl5&gt; die alten Regeln wieder einsetzen. Jedoch m��en <br />
Optionen auf jeden Fall vor die Regex oder in sie hinein in eine C&lt;(?m ...)&gt; Gruppe.</p>
<h3 id="die_gro_e_perpektive">Die gro�e Perpektive</h3>
<p>
Auch wenn mit dem neuen Syntax viele Details klarer werden, k�nnen Regex immer<br />
noch schnell unleserlich werden, wenn komplexe Zusammenh�nge eingelesen und <br />
aufgespalten werden sollen. (Wir bauen mal schnell einen HTML-Parser.) Hierf�r<br />
br�uchte es Mittel wie lex und yacc, die ein Stufenweises aufspalten erlauben.<br />
Die dazu verwendeten Regeln w�ren verst�ndlicher und einfacher wiederverwendbar.<br />
Genau diese �berlegungen stehen hinter den Perl 6-Grammatiken. Eine C&lt;grammar&gt;<br />
ist in Wirklichkeit eine Klasse, deren Methoden Regex sind. Deshalb behandelt<br />
dieses Tutorial auch die Regex nach der OOP, obwohl Strings ein elementares<br />
Thema f�r Perlprogrammierer sind. F�r C&lt;grammar&gt; wurden 3 spezielle Typen von<br />
Routinen geschaffen. Dies w�re zum einen C&lt;regex&gt;. Damit wird klar warum die<br />
Schreibweise C&lt;regex <a href="http://www.perlfoundation.org/perl6/index.cgi?name" title="[click to create page]" class="incipient">name</a> {}&gt; geschweifte Klammern verlangt. Eine C&lt;sub&gt; wird<br />
ebenfalls nur mit geschweiften Klammern geschrieben. Um das Parsen einfacherer <br />
Regeln effektiver und das Kombinieren von Teilregeln optisch zu vereinfachen gibt<br />
es noch den Routinentyp C&lt;rule&gt;. Der entspricht C&lt;regex :ratchet :sigspace {...}&gt;.<br />
Der dritte Typ (C&lt;token&gt;) wurde geschaffen um Grundbausteine zu definieren und<br />
entspricht C&lt;regex :ratchet { ... }&gt;. Ein Grammatik um eine Flie�kommazahl zu<br />
zerlegen s�he ungef�hr so aus:</p>
<p>
	grammar Float {<br />
		rule digits { \d+ }<br />
		rule sign { \+ | - }<br />
		rule exp :i { e &lt;sign&gt;? &lt;digits&gt; }<br />
		rule man { \. &lt;digits&gt; | &lt;digits&gt; [ \. &lt;digits&gt;? ]? }<br />
		rule top { &lt;sign&gt;? &lt;man&gt; &lt;exp&gt;? }<br />
	}</p>
<p>
Einzelne C&lt;rules&gt; definieren Teilausdr�cke die sp�tere C&lt;rules&gt; verwenden, indem<br />
sie den Namen der C&lt;rule&gt; in spitze Klammern setzen. Spitze Klammern und Punkt<br />
markieren Teilausdr�cke deren Fund nicht gespeichert wird. (wie das erw�hnte &lt;.ws&gt;)<br />
Diese C&lt;rules&gt; sind tats�chlich Routinen denn ich kann sie wie welche aufrufen.</p>
<p>
	my $result = Float.top(&quot;-6.02e+23&quot;);</p>
<p>
In C&lt;$/{'man'}&gt; oder C&lt;$result{'man'}&gt; steht nun z.B. &quot;6.02&quot;, in C&lt;$/{'exp'}{'sign'}&gt;<br />
ein Pluszeichen, da dies das Vorzeichen des Exponenten ist. Aus Folge vier wissen<br />
wir das Hashschl�ssel auch einfacher geschrieben werden k�nnen, z.B. &quot;$/&lt;sign&gt;&quot;.<br />
Nun kann man erkennen wieviel Sinn es macht, benannte Teilausdr�cke in spitze<br />
Klammern zu setzen, da die Hashschl�ssel unter denen ihr Fund gespeichert ist,<br />
gleich aussehen. �hnliches war innerhalb einer Regex ab Perl 5.10 nur mit<br />
&quot;(?&lt;name&gt; ...)&quot; erreichbar. Grammatiken sind allerdings wie (andere Klassen auch)<br />
ableitbar und k�nnen so einfach auf bereits bekannte Art kombiniert und erweitert<br />
werden. Dies ist nicht nur praktisch sondern erlaubt erst viele besondere<br />
F�higkeiten von Perl 6, da� damit immer mehr zu einer Meta-Programmiersprache<br />
mutiert. Metaprogrammierung wird jedoch Thema der n�chsten und letzten Folge sein.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_6" title="(34 months)  toc Objects and Roles Willkommen und hereinspaziert mein Damen und Herren. Hier erleben sie Mensche...">Previous Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 6 --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(39 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_8" title="(34 months)  toc Herzlich willkommen auch zum achten und letzten Teil dieses tiefsch rfenden Tutoriums f r werde...">Next Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 8 --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_7</guid>
<pubDate>Fri, 06 Aug 2010 23:57:37 -0000</pubDate>
</item>

<item>
<title><![CDATA[Perl 6 Tutorial Part 6]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_6</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#objects_and_roles">Objects and Roles</a><!-- wiki: {link: [] Objects and Roles} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#das_alte_system">Das alte System</a><!-- wiki: {link: [] Das alte System} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#und_nun_das_neue">... und nun das Neue</a><!-- wiki: {link: [] ... und nun das Neue} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#verwendung_von_objekten">Verwendung von Objekten</a><!-- wiki: {link: [] Verwendung von Objekten} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#delegier_die_arbeit">Delegier die Arbeit</a><!-- wiki: {link: [] Delegier die Arbeit} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#regelung_der_erbschaft">Regelung der Erbschaft</a><!-- wiki: {link: [] Regelung der Erbschaft} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#rollen_die_ich_spiele">Rollen die ich spiele</a><!-- wiki: {link: [] Rollen die ich spiele} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#zeig_mir_dein_inneres">Zeig mir dein Inneres</a><!-- wiki: {link: [] Zeig mir dein Inneres} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><h3 id="objects_and_roles">Objects and Roles</h3>
<p>
Willkommen und hereinspaziert mein Damen und Herren. Hier erleben sie Menschen -<br />
Tiere - Sensationen, so etwas hat die Welt noch nicht gesehen. Und fürwahr das <br />
Objektsystem von Perl 6 übertrifft in seiner Ausgereiftheit und Vielseitigkeit <br />
alles bisher aus der Praxis Bekannte. Hier gab es einige der stärksten Änderungen<br />
gegenüber Perl 5. Vieles davon ist jedoch heute bereits (leicht abgeändert) mit <br />
Moose umsetzbar.</p>
<h3 id="das_alte_system">Das alte System</h3>
<p>
Die alte OOP bestach vor allem durch ihre Freiheit und daß sie mit minimalstem<br />
syntaktischen Aufwand in das objektlose Perl 4 eingefügt wurde. Nur C&lt;bless&gt; (der<br />
Befehl zur Erzeugung eines Perl 5-Objektes) kam extra deshalb dazu. Und dieser<br />
Befehl bindet &quot;lediglich&quot; eine Referenz - meist eine Hashreferenz - an ein C&lt;package&gt;<br />
und macht sie so zum Objekt. Damian Conway bewundert diesen &quot;Taschenspielertrick&quot;, <br />
und zeigt in seinem Buch I&lt;&quot;Object Oriented Perl&quot;&gt;&quot; die immensen Möglichkeiten des<br />
&quot;Tricks&quot; auf. Larry hatte diesen &quot;Trick&quot; eigentlich von Python abgeschaut, es <br />
aber seitdem bereut. Nicht nur Guido van Rossum hat mit der kürzlich erschienenen<br />
Version 3 diese Art der OOP aus Python gestrichen, auch Perlkreise sehen dieses<br />
Objektsystem derzeit als größte Schwachstelle der Perlsyntax. Es ist nicht nur für<br />
viele Perlneulinge eine echte Hürde, sondern verstößt auch gegen Perls eigene Regeln.</p>
<p>
Was Perl ausmacht, zeigt das alltägliche Grundbeispiel, das gleichzeitig den ersten<br />
Babyschritten jedes Programmierers entspricht: C&lt;print &quot;Ich kann schon laufen!\n&quot;&gt;.<br />
Keine Systembibliothek wird importiert, keine C&lt;main&gt;-Routine ist notwendig, keine<br />
Klasse muss drumherum gestrickt werden. Dem Programmierer wird weder Arbeit noch<br />
Wissen abverlangt, das nicht unbedingt notwendig ist. In Perl 6 und 5.10 reicht<br />
sogar C&lt;say &quot;Ich kann schon laufen!&quot;&gt;, da die Bedeutung von Steuerzeichen sicher<br />
nicht das Erste ist, was Anfänger lernen sollten. Wenn er jedoch eine einfache<br />
Klasse schreiben will, braucht er einige Kenntnis von Namensräumen, Referenzen,<br />
Hashes, C&lt;bless&gt; und Perls eigenwilliger Art der Parameterübergabe, wie es das <br />
folgende Beispiel zeigt:</p>
<p>
Perl 5:</p>
<p>
	package Heart::Gold;</p>
<p>
	sub new {<br />
		bless {speed =&gt; 0 }, shift;<br />
	}</p>
<p>
	sub speed {<br />
	 my $self = shift;<br />
	 my $speed = shift;<br />
	 if ($speed) { $self-&gt;{speed} = $speed }<br />
	 else { $self-&gt;{speed} }<br />
	}</p>
<p>
	sub stop {<br />
	 my $self = shift;<br />
	 $self-&gt;{speed} = 0;<br />
	}</p>
<p>
Benutzt wird diese Klasse wie folgt:</p>
<p>
Perl 5:</p>
<p>
	my $ufo = Heart::Gold-&gt;new();<br />
	# &quot;gib Gas, Scotty&quot;<br />
	$ufo-&gt;speed('7c');<br />
	# &quot;alle Maschinen halt&quot;<br />
	$ufo-&gt;stop();</p>
<p>
Für gute Perl-Programmierer ist das kein Problem, aber sie freuen sich über Wege,<br />
das Gleiche mit weniger Tippaufwand zu erreichen, wie die Existenz von I&lt;Moose&gt;,<br />
I&lt;Class::Accessor::Fast&gt; und mindestens einem Dutzend weiterer Module beweist. <br />
Tipparbeit zu reduzieren ist ebenfalls ein wichtiges Perlziel.</p>
<h3 id="und_nun_das_neue">... und nun das Neue</h3>
<p>
Eine fast funktionsgleiche Klasse sähe in Perl 6 so aus:</p>
<p>
Perl 6:</p>
<p>
	class Heart::Gold {<br />
		has $.speed;<br />
		method stop { $speed = 0 }<br />
	}</p>
<p>
Das ist kurz, klar und weniger fehleranfällig. Bereits der erste Befehl kündigt<br />
unmissverständlich an, daß hier eine Klasse erzeugt wird (deklarativer Syntax).<br />
C&lt;class&gt; ist (genau genommen) ein I&lt;Blockmodifikator&gt;, der dem nachfolgendem <br />
(in geschweiften Klammern stehenden) lexikalischen Bereich einen Namen zuweist<br />
(wie C&lt;package&gt;) und daraus ein Protoobjekt erzeugt aus dem nachfolgend Objekte<br />
geklont werden können. Perl 6 hat eine prototyp-basierte OOP, ähnlich Javascript. <br />
Möglich ist auch die Schreibweise C&lt;class Heart::Gold;&gt; ohne geschweifte Klammern.<br />
Dann nimmt der Interpreter jedoch an, daß alles bis zum Dateiende zu jener Klasse<br />
gehört.</p>
<p>
Der zweite Befehl (C&lt;has&gt;) definiert ein Attribut der Klasse. Attribute sind die<br />
Daten die zu jedem Objekt gehören und die von außen unsichtbar sind. (Das wäre in<br />
Perl 5 nicht einfach möglich.) Auf manche dieser Daten ist aber der Zugriff von<br />
außen gewünscht. In vielen Sprachen werden deshalb Methoden geschrieben die Werte<br />
von und zu den Attributen weiterleiten. In Perl 6 kann der Programmierer mit der<br />
Twigil (dem Punkt nach &quot;$&quot;) die öffentlichen Attribute markieren und die Methode<br />
gleichen Namens, die einen Zugriff von außen erlaubt, wird automatisch erzeugt.<br />
Möchte man neben dem &quot;Getter&quot; auch einen &quot;Setter&quot; (Methode, die dem Attribut <br />
einen Wert zuweist), muss man das Attribut mit dem Trait (Eigenschaft die während<br />
der Kompilierung unabänderlich festgelegt wird - zu deutsch: Charakterzug) C&lt;rw&gt;<br />
versehen.</p>
<p>
		has $.speed is rw;</p>
<p>
C&lt;rw&gt; steht für &quot;read/write&quot; (lesen/schreiben) und wird zu vielen Gelegenheiten<br />
angewendet, z.B. wenn eine Datei für Lese- und Schreibzugriff geöffnet wird. <br />
Der erzeugte Setter ist eine Lvalue-Routine. Ihm kann also zugewiesen werden.<br />
Das erlaubt nicht nur einen einfachen, intuitiven Umgang, da Getter und Setter<br />
sich wie Variablen verhalten, es vermeidet auch hinterhältige Fallen, die eine<br />
selbstgeschriebene, kombinierte Getter/Setter-Methode aufstellt. Sie sind auch<br />
angenehmer im Umgang als die Getter/Setter, die in unserem Beispiel &quot;GetSpeed&quot;<br />
und &quot;SetSpeed&quot; oder &quot;get_speed&quot; / &quot;set_speed&quot; heißen würden. Sind alle oder die<br />
Mehrheit der Attribut &quot;rw&quot;, ist es kürzer zu schreiben:</p>
<p>
	class Heart::Gold is rw { ...</p>
<p>
Soll ein Attribut privat sein, wird es mit &quot;!&quot; (Punkt mit Wand darüber) markiert.<br />
Der automatisch erzeugte Getter ist dann eine private Methode, die nur innerhalb<br />
der Klasse benutzt werden kann. Ohne Twigil wird keine Zugriffsmethode erzeugt.<br />
Das ist auch nicht notwendig, da jedes Attribut innerhalb der Klasse einer <br />
lexikalisch lokalen Variable entspricht. Deshalb kann es auch kein gleichnamiges<br />
privates und öffentliches Attribut geben. (Innerhalb der Beispielklasse greift<br />
C&lt;$.speed&gt;, C&lt;$!speed&gt; und C&lt;$speed&gt; auf das gleiche Attribut zu.) Eine lokale<br />
Klassenvariable (kein Attribut) is jedoch möglich, wenn auch nicht empfehlenswert,<br />
es der Autor wünscht sich eine Variable die alle Instanzen der Klasse teilen. <br />
Dies hieße ebenfalls C&lt;$speed&gt;, während das Attribut weiterhin mit C&lt;$!speed&gt; <br />
in der Klasse erreichbar wäre, in der es definiert wurde. Die Befehle C&lt;my&gt; und<br />
C&lt;our&gt; haben bei I&lt;Accessoren&gt; (Getter/Setter) keinen Effekt.</p>
<p>
Der dritte neue Befehl ist C&lt;method&gt;, der selbsterklärend (anstatt C&lt;sub&gt;) eine<br />
Methode erzeugt (deklarativer Syntax). Methoden sind Routinen eines Objektes.<br />
Objekte wurde ja &quot;erfunden&quot; um Daten mit zugehörigen Routinen zusammenzufassen.<br />
Sie werden nun mit C&lt;$objekt.methode()&gt; anstatt C&lt;$objekt-&gt;methode()&gt; aufgerufen.<br />
Das spart ein Zeichen zu tippen, liest sich leichter und ist verbreiteter Standard.<br />
Mit diesem Wissen wird klar, warum C&lt;$.speed&gt; der Befehl ist, eine gleichnamige<br />
Methode zu erzeugen.</p>
<h3 id="verwendung_von_objekten">Verwendung von Objekten</h3>
<p>
Ein weiterer großer Unterschied zum Perl 5-Beispiel ist das Fehlen der Methode<br />
C&lt;new&gt;. Die wird automatisch erzeugt, da der Interpreter auf alle nötigen<br />
Informationen zugreifen kann. Bei Bedarf kann allerdings eine eigene C&lt;new&gt;-Methode<br />
oder ebenso eigene Getter/Setter erstellt werden, welche die autogenerierten<br />
Methoden überschreiben. Die Verwendung einer Klasse sieht damit so aus:</p>
<p>
	my $ufo = Heart::Gold.new();<br />
	$ufo.speed ='5c';<br />
	$ufo.stop;<br />
	# 0, da numerischer Kontext erzwungen wird<br />
	say + $ufo.speed;</p>
<p>
Die ersten beiden Schritte ließen sich sogar noch zusammenfassen:</p>
<p>
	my $ufo = Heart::Gold.new( speed =&gt;'5c'); #oder<br />
	my Heart::Gold $ufo .= new( speed =&gt;'5c');</p>
<p>
Praktischerweise kann die autogenerierte C&lt;new&gt;-Methode auch Attribute befüllen.<br />
Im zweiten Fall wird der Variable die Klasse (Protoobjekt) als Datentyp zugewiesen.<br />
Gemäß der Logik selbszuweisender Operatoren (z.B.&quot;+=&quot;) wird .new auf den Aufrufer<br />
angewendet und so entsteht ebenfalls ein Objekt. Diese Art der &quot;selbstzuweisenden&quot;<br />
Methoden wird I&lt;Mutator&gt; genannt (z.B. auch C&lt;@array .= sort&gt;). Auf diese Weise<br />
kann man ebenso Objekte durch Klonen erzeugen:</p>
<p>
	# mit alternative Paar-Konstruktor<br />
	my $arv = $ufo.clone( :speed&lt;2c&gt; );</p>
<p>
Natürlich kann ein ganzer C&lt;%Hash&gt; an Werten bei der Erzeugung übergeben werden.<br />
Dabei sieht die Syntax etwas wie Perl 5 aus, da es immer noch eine Methode namens<br />
C&lt;bless&gt; gibt, die ähnlich dem altem C&lt;bless&gt;-Befehl funktioniert.</p>
<p>
	my $klasse = class Heart::Gold { ... }<br />
	my %werte = :speed&lt;20c&gt;;<br />
	$efv = $klasse.bless( %werte );</p>
<p>
Eine Kleinigkeit fehlt aber noch: Wie erklärt man eine Methode C&lt;protected&gt;, also<br />
nicht über ein Objekt aufrufbar? (C&lt;$objekt.methode()&gt;) Genau wie man seit Perl 5<br />
Variablen auch in einem Namensraum von außen abschottet, mit C&lt;my&gt;.</p>
<p>
	class Heart::Gold {<br />
		my method secret_maneuver { ... }<br />
	}<br />
	my $ufo = Heart::Gold.new;<br />
	# Laufzeiterror:<br />
	$ufo.secret_maneuver;</p>
<p>
Mit C&lt;my&gt; lassen sich auch lexikalisch lokale Klassen deklarieren. Die benötigt<br />
man zum Beispiel, wenn Attribute selber Objekte sind, deren Klasse geheim bleiben<br />
soll. In diesem Beispiel:</p>
<p>
	class Heart::Gold {<br />
		class Movement { ... }<br />
		has int $.length where {$_ &gt;= 0};<br />
		has Movement $drive;<br />
		my method secret_maneuver { ... }<br />
	}</p>
<p>
hat ein Attribut einen vor Ort erstellten Subtyp (siehe letzte Folge), das andere<br />
ist ein Objekt (Instanz der Klasse C&lt;Movement&gt;). Da diese Klasse nicht mit C&lt;my&gt;<br />
als lexikalisch lokal deklariert wurde, ließen sich außerhalb von C&lt;Heart::Gold&gt;<br />
ebenso C&lt;Movement&gt;-Objekte erstellen. Auch prozeduraler Zugriff auf den Namensraum<br />
C&lt;Movement&gt; wäre dann möglich.</p>
<h3 id="delegier_die_arbeit">Delegier die Arbeit</h3>
<p>
Eine Klasse C&lt;Movement&gt; ist sinnvoll, da solch ein fortschrittliches Fluggerät,<br />
sicher sehr viele Eigenschaften (Attribute) und Funktionen (Methoden) besitzt.<br />
Sie alle in eine Klasse zu schreiben ginge zu Lasten der Nachvollziehbarkeit.<br />
Unser Attribut C&lt;$drive&gt;, welches das Antriebsaggregat repräsentiert, ist also<br />
ein Objekt, dessen Methoden nun Informationen über Geschwindigkeit und ähnliches<br />
herausgeben. Es erscheint als müsste nun doch ein I&lt;Getter&gt; C&lt;$.speed&gt; geschrieben<br />
werden, welcher die Methode C&lt;$drive.speed&gt; aufruft und ihr Ergebins weiterleitet.<br />
Aber auch hierfür gibt es eine kurze Schreibweise die genau dies automatisch tut.</p>
<p>
	class Heart::Gold {<br />
		has Movement $drive handles 'speed';</p>
<p>
Dieses Konzept wird in der OOP-Welt I&lt;Delegation&gt; genannt und wird natürlich wie<br />
fast alles bekannte auch von Perl 6 angeboten. Nich umsonst heißt das neue Motto:<br />
&quot;all your paradigms are belong to us&quot;.</p>
<h3 id="regelung_der_erbschaft">Regelung der Erbschaft</h3>
<p>
Somit erübrigt sich auch die Frage: &quot;Gibt es Mehrfachvererbung in Perl 6?&quot;, doch<br />
beginnen wir mit der Einfachen. Klassen vererben einander all ihre Attribute und<br />
Methoden. Das nennt man auch &quot;ableiten&quot;. So kann eine einmal geschriebene Klasse<br />
wiederverwendet und Schritt für Schritt erweitert werden. Besitzt die Elternklasse<br />
dabei eine Methoden, welche der Sprössling auch definiert, so überschreibt er<br />
damit die geerbte Methode. Ich könnte eine einfache Klasse schreiben, die den Flug<br />
von Pollen oder einer Pusteblume wiedergibt. Von dieser könnte eine nächste erben<br />
und einige Methoden zufügen, welche Manöver eines Heißluftballons beschreiben,<br />
u.s.w bis wir in sechster oder siebenter Generation einen Ufoantrieb haben der<br />
auch auf die Zeitverschiebungen bei Interdimensionsreisen eingehen kann.</p>
<p>
	class UfoDrive is AdvancedRocket {<br />
		...<br />
	}</p>
<p>
Da die &quot;Heart of Gold&quot; bekanntermaßen einen Unwahrscheinlichkeitsantrieb besitzt,<br />
der die unwahrscheinlichen Beträge auf den Rechnungen des integrierten Restaurants<br />
nutzt, muss noch von einem solchen alles vererbt werden.</p>
<p>
	class UfoDrive is AdvancedRocket is Restaurant { ... }</p>
<p>
Das ist eine Kurzschreibweise für:</p>
<p>
	class UfoDrive {<br />
		is AdvancedRocket;<br />
		is Restaurant;<br />
		...<br />
	}</p>
<p>
Es sei anzumerken, daß die Klasse I&lt;Restaurant&gt; gleichnamige Methoden der Klasse<br />
I&lt;AdvancedRocket&gt; &quot;überschreibt&quot;. In Java können Klassen als &quot;final&quot; markiert<br />
werden. Das ist in Perl 6 nicht direkt vorgesehen, jedoch kann in einem Programm<br />
mit dem Pragma C&lt;use oo :final;&gt; angewiesen werden, alle Klassen automatisch als<br />
&quot;final&quot; zu betrachten. Ausnahmen können mit</p>
<p>
	{<br />
		use class :nonfinal;<br />
		class UfoDrive { ... }<br />
		class Heart::Gold { ... }<br />
	}</p>
<p>
oder</p>
<p>
	class Insect is nonfinal { ... }</p>
<p>
angegeben werden. Einzelne Methoden, die nicht vererbt werden sollen, können als<br />
C&lt;submethod&gt; deklariert werden, die ebenfalls mit einem C&lt;my&gt; davor nicht über<br />
ein Objekt oder den Namensraum aufrufbar sind.</p>
<h3 id="rollen_die_ich_spiele">Rollen die ich spiele</h3>
<p>
Eine Rolle wird definiert wie eine Klasse, nur mit dem Schlüsselwort C&lt;role&gt;<br />
anstatt C&lt;class&gt;.</p>
<p>
	role Blinken {<br />
		has @.lichter;<br />
		method blinken { ... }<br />
	}</p>
<p>
Von einer C&lt;role&gt; kann aber kein Objekt erzeugt (geklont) werden. Wozu dient dann<br />
eine C&lt;role&gt;? Die Praxis hat gezeigt, daß mit Klassen allein der Code nicht immer<br />
einfach wiederverwendbar ist. Schnell kam es zu Bäumen von Vererbungshierarchien.<br />
Was aber tun, wollten zwei &quot;Äste eines Baums&quot; wenige Methoden gemeinsam verwenden?<br />
Selbst Sprachen, die Mehrfachvererbung kennen (nicht Java und C#) erzeugen damit<br />
neue Probleme, die mit Rollen vermieden werden können. Sie sind auch syntaktisch<br />
natürlicher und bieten sogar mehr Sicherheit ungewollte Methoden zu überlagern als<br />
Rubys I&lt;Mixins&gt;. Rollen werden während der Kompilierung in Klassen &quot;eingebunden&quot;,<br />
wenn es die Klasse fordert.</p>
<p>
	class Heart::Gold does Blinken {</p>
<p>
oder</p>
<p>
	class Heart::Gold {<br />
		does Blinken;<br />
		...<br />
	}</p>
<p>
Wie zu erahnen, besitzt nun auch die Klasse I&lt;Heart::Gold&gt; die Methode I&lt;blinken&gt;.<br />
Roles können jedoch nicht Methoden einer Klasse überlagern. Versuchen zwei Roles<br />
gleichnamige Methoden zu importieren gibt es einen Fehler beim Kompilieren, es<br />
sei denn die Klasse hatte eine gleichnamige Methode und der Konflikt muss nicht<br />
gelöst werden. Perl 6 kennt Wege wie Roles und Klassen ihre Konflikte selbst lösen<br />
können, dies würde aber den Rahmen überdehnen. Was jedoch jeder über Roles wissen<br />
sollte, der ihre Verwendung in Betracht zieht, betrifft Attribute. Roles können<br />
natürlich eigene Attribute mitbringen. Dies tat die Role im Beispiel mit:</p>
<p>
	has @.lichter; # oder:<br />
	has @!lichter; # oder:<br />
	my @!lichter; # für Klasse unsichtbar</p>
<p>
Sie könnte aber auch Attribute der Klasse mitnutzen. Das meldet sie an mit:</p>
<p>
	has @lichter;</p>
<p>
und der Kompiler prüft ob die Klasse dieses Attribut besitzt. Ein großer Nutzen<br />
der Roles kommt auch von ihrer Fähigkeit sich auch zur Laufzeit einzubinden.</p>
<p>
	$ufo does Blinken;</p>
<p>
Mehrere Roles müssen einzeln gebunden oder geklammert werden:</p>
<p>
	(($ufo does Blinken) does Tarnen);</p>
<p>
Bei diesen Fähigkeiten, gibt es auch Bedarf zur Laufzeit zu prüfen, ob eine Role<br />
in ein Objekt &quot;eingemischt&quot; wurde.</p>
<p>
	if $ufo.does(Blinken) { ... }</p>
<p>
Was in unserem Falle wahr (Bool::True) ist. Ebenso kann geprüft werden ob ein <br />
Objekt von einer Klasse abgeleitet wurde:</p>
<p>
	if $ufo.isa(Heart::Gold) { ... }</p>
<p>
Dieser Syntax ähnelt sehr Perl 5, Folgendes ist jedoch neu, auch wenn Perl 5.10 <br />
bereits smartmatch kennt:</p>
<p>
	if $ufo ~~ Blinken { ... }<br />
	if $ufo ~~ Heart::Gold { ... }</p>
<p>
Beide Fälle sind genauso wahr, da C&lt;~~&gt; eine große Tabelle hat und je nach Typ der<br />
Parameter versucht das &quot;Richtige&quot; zu tun. Solches Verhalten erreicht man durch<br />
C&lt;multi&gt;-Methoden (in vorigen Folge vorgestellt). Wenn I&lt;Roles&gt; I&lt;Multimethoden&gt;<br />
importieren, dürfen diese gleichnamig sein, solange die Signaturen nicht gleich<br />
sind.</p>
<h3 id="zeig_mir_dein_inneres">Zeig mir dein Inneres</h3>
<p>
Objekte lassen sich in Perl 6 weitaus tiefer durchleuchten als es das Smartmatch<br />
tut. C&lt;$ufo.HOW&gt; oder C&lt;^Heart::Gold&gt; erlaubt z.B. den Zugriff auf die Metaklasse<br />
und C&lt;Heart::Gold.^methods()&gt; liefert beispielsweise alle Methoden der Klasse. <br />
Doch an der Stelle möchte ich mich für dieses mal verabschieden, da die Methoden<br />
zur Introspektion (hoffentlich bald vollständig) im Tutorial der Perl-Community.de<br />
Wiki aufgelistet sind und ein Aufzählen einer API langweilig ist. Diese API ist, <br />
im Gegensatz zu dem in dieser Folge vorgestellten Syntax, keinesfalls stabil und<br />
endgültig, sodass ein Blick in den tabellarischen Index B des Tutorials sinnvoll<br />
ist. Die nächste Folge wird behandeln, was Perl einst berühmt und berüchtigt <br />
machte: die regulären Ausdrücke die jetzt wirklich regulär sind, sich nicht mehr<br />
Ausdruck nennen und auch wie Objekte behandelt werden können.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_5" title="(34 months)  toc Captures und Subroutinen Willkommen zum fünften Teil dieses ausführlichen Perl 6-Tutorials, der...">Previous Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 5 --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(39 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_7" title="(34 months)  toc Text, Rules and Grammars Willkommen zum siebenten Teil dieses poetischen Perl 6-Tutorials, da v...">Next Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 7 --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_6</guid>
<pubDate>Fri, 06 Aug 2010 23:56:07 -0000</pubDate>
</item>

<item>
<title><![CDATA[Perl 6 Tutorial Part 5]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_5</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#captures_und_subroutinen">Captures und Subroutinen</a><!-- wiki: {link: [] Captures und Subroutinen} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#geforderte_parameter">Geforderte Parameter</a><!-- wiki: {link: [] Geforderte Parameter} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#bla_bla_bla">Bla Bla Bla</a><!-- wiki: {link: [] Bla Bla Bla} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#optionale_parameter">Optionale Parameter</a><!-- wiki: {link: [] Optionale Parameter} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#schl_C3_BCrfende_parameter">Schlürfende Parameter</a><!-- wiki: {link: [] Schlürfende Parameter} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#benannte_parameter">Benannte Parameter</a><!-- wiki: {link: [] Benannte Parameter} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#was_zum_sind_capture">Was zum $@%&amp; sind Capture?</a><!-- wiki: {link: [] Was zum $@%& sind Capture?} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#multi_sub_s">Multi Sub's</a><!-- wiki: {link: [] Multi Sub's} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#parameter_traits">Parameter Traits</a><!-- wiki: {link: [] Parameter Traits} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#eingewickelte_routinen">Eingewickelte Routinen</a><!-- wiki: {link: [] Eingewickelte Routinen} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#r_C3_BCckgabekontext">Rückgabekontext</a><!-- wiki: {link: [] Rückgabekontext} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#module_und_scope">Module und Scope</a><!-- wiki: {link: [] Module und Scope} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><h3 id="captures_und_subroutinen">Captures und Subroutinen</h3>
<p>
Willkommen zum fünften Teil dieses ausführlichen Perl 6-Tutorials, der sich nur<br />
mit dem kleinen &quot;sub&quot;-Befehl beschäftigen wird und einige Dingen die dazu gehören.<br />
Subroutinen oder Funktionen, die in Perl 6 immernoch mit C&lt;sub&gt; deklariert werden,<br />
gehören zu den wichtigsten und grundlegendsten Techniken der Programmierkunst.<br />
Es sind Teilprogramme die mit einem möglichst aussagekräftigen Namen aufgerufen<br />
werden. Meist werden ihnen Werte übergeben und oft liefern sie auch ein Ergebnis<br />
zurück. Jeder der schon etwas Perl kennt, hat bereits Ähnliches geschrieben wie<br />
folgende Funktion, welche die Länge der Hypotenuse berechnet.</p>
<p>
	sub hypotenuse {<br />
		my ($a, $b) = @_;<br />
		sqrt( $a**2 + $b**2 );<br />
	}</p>
<p>
Und die gute Nachricht für Lernfaule lautet: Dies ist vollständig gültiges Perl 6.<br />
Menschen die jedoch gerade von C oder Java zu Perl wechseln, hätten die Subroutine<br />
wohl so geschrieben:</p>
<p>
	sub hypotenuse ($a, $b) {<br />
		return sqrt( $a*$a + $b*$b );<br />
	}</p>
<p>
Und die gute Nachricht für diese Neulinge lautet: Dies ist ebenfalls vollständig<br />
gültiges Perl 6. Die zweite Lösung liegt näher an dem was die meisten anderen <br />
Sprachen da draußen betreiben (entspricht häufig den Lesegewohnheiten) und sie<br />
spart mühevolle Fingerbewegungen (ebenfalls ein Indikator ob etwas perlish ist).<br />
Aber was genau wurde geändert? Folgen dem C&lt;sub&gt;-Namen runde Klammern, definiert<br />
das eine Signatur (Liste der Parameter) und keine Prototypen mehr wie in Perl 5.<br />
Diese Parameter (auch C&lt;@&gt;) sind keine lokalen Variablen und (wenn vorher nicht<br />
anders deklariert) schreibgeschützt. Folgt keine Signatur, landen Parameter in<br />
C&lt;@&gt;, wie aus Perl 5 gewohnt. TIMTOWTDI.</p>
<h3 id="geforderte_parameter">Geforderte Parameter</h3>
<p>
Signaturen helfen jedoch nicht nur Neulingen, sondern nehmen Jedem Arbeit ab. <br />
Zum Beispiel kann C&lt;sub hypotenuse&gt; nur dann sinnvolle Ergebnisse erzielen, wenn<br />
sie 2 Parameter bekommt. Im alten System der Parameterübergabe wäre es aufwendig<br />
dies einzufordern. In Perl 6 braucht der Programmierer dafür gar nichts zu tun, <br />
denn würde man die zweite Routine mit C&lt;hypotenuse(5)&gt; oder C&lt;hypotenuse(2,3,4)&gt;<br />
aufrufen, gäb es eine dicke Fehlermeldung zur Kompilierungszeit. Wäre die C&lt;sub&gt;<br />
wie im ersten Beispiel implementiert, würde der Kompiler lautlos schnurren wie<br />
ein Kätzchen, auch wenn die Ergebnisse der Funktion nicht immer brauchbar wären.<br />
Doch wenn schon die Parameter prüfen, dann auch auf den Datentyp. C&lt;Num&gt; ist ein<br />
nativer Datentypen für Skalare und entspricht dem Zahlenbereich rationaler Zahlen.</p>
<p>
	sub hypotenuse (Num $a, Num $b) {<br />
		return sqrt( $a*$a + $b*$b );<br />
	}</p>
<p>
Der Vorteil einer solchen Prüfung: die Fehlermeldung kommt, wenn Unbeabsichtigtes<br />
passiert (hier bei nichtnumerischen Längenangaben), nicht erst Zeilen später,<br />
wenn ein Folgebefehl versagt. Somit sind Ursachen wesentlich leichter auffindbar.<br />
Und um konsequent zu sein sollte die C&lt;sub hypotenuse&gt; nur Zahlen größer als 0<br />
zulassen, da sie mit physischen Längen rechnet. Dazu definieren wir den eigenen<br />
Datentyp C&lt;Num+&gt; (analog zu Q+) als Untermenge von C&lt;Num&gt; wie folgend:</p>
<p>
	subset Num+ of Num where { $_ &gt; 0 };</p>
<p>
Perfekt wäre es, wenn auch der Typ des Rückgabewertes festgelegt werden könnte.<br />
Das wirkt in diesem Beispiel vielleicht etwas übertrieben, aber Programme werden<br />
so zuverlässiger. Diese Art der Programmierung, bei der der Compiler die Anzahl,<br />
und Typen der Ein- und Ausgabe einer Routine prüft, wird &quot;Design by Contract&quot;<br />
genannt und wurde zuerst durch die Sprache Eiffel bekannt. Da Perl 6 Motto heißt <br />
&quot;All your Paradigm's belong to us&quot; heisst, ist das beschriebene auch hier möglich:</p>
<p>
	Num+ sub hypotenuse (Num+ $a, Num+ $b) { ... }<br />
	sub hypotenuse (Num+ $a, Num+ $b --&gt; Num+) { ... }</p>
<h3 id="bla_bla_bla">Bla Bla Bla</h3>
<p>
Die &quot;...&quot; in den letzten Beispielen waren nicht nur Dekoration die andeutet,<br />
daß an dieser Stelle der eigentliche Code später eingefügt wird. Auch der Perl 6<br />
versteht es in dem Sinne. Der Interpreter geht davon aus, daß der Programmierer<br />
nicht ohne Grund beginnt eine Subroutine zu schreiben und möchte ihm mit einem <br />
freundlichen Kompilererror daran erinnern, daß im Falle:</p>
<p>
	sub hypotenuse; # oder<br />
	sub hypotenuse { }</p>
<p>
etwas fehlt. Der geschickte Softwarearchitekt kann aber mit dem Operator namens<br />
&quot;yadayadayada&quot; (zu deutsch bla bla bla) dem Interpreter mitteilen, daß er später<br />
die Routine schreiben wird. Je nachdem ob er möchte das die jetzige Routine ein<br />
fail, eine Warnung (C&lt;warn&gt;), oder einen Error (C&lt;die&gt;) liefert, kann er die<br />
Schreibweisen C&lt;...&gt;, C&lt;???&gt; oder C&lt;!!!&gt; verwenden. Doch kehren wir zurück zum<br />
ersten Beispiel.</p>
<h3 id="optionale_parameter">Optionale Parameter</h3>
<p>
Manchmal braucht es aber Routinen, die je Situation unterschiedlich viele Parameter<br />
bekommen. Wie deklarier ich das in der Signatur, ohne daß sich der Interpreter<br />
beschwert? In dem ich den Paramtern ein Fragezeichen anhängt und sie damit als<br />
optional markiert.</p>
<p>
	sub hypotenuse (Num+ $a, Num+ $b, Str $txt? --&gt; Num+) {<br />
		my $h = sqrt( $a*$a + $b*$b );<br />
		say &quot;$txt $h.&quot; if $txt;<br />
		return $h;<br />
	}</p>
<p>
Man muß nur darauf achten, in der Signatur die optionalen Parameter nach den <br />
Notwendigen zu positionieren, da alle Parameter in der Reihenfolge befüllt werden,<br />
in der sie der Routine übergeben werden. Deshalb sollte auch die Reihenfolge der<br />
optionalen Parameter sorgfältig überdacht werden, um sie von links nach recht von<br />
mehr zu weniger wichtig zu sortieren. Der Befehl C&lt;if $txt&gt; wird auf keinen Fall<br />
Probleme bereiten. Denn auch wenn kein Antwortsatz gewünscht ist und C&lt;$txt&gt; leer<br />
bleibt, wird die Variable auf jeden Fall mit C&lt;undef&gt; initialisiert. Um andere<br />
default-Werte festzulegen könnte man schreiben:</p>
<p>
	Num+ sub hypotenuse (Num+ $a, Num+ $b, Str $txt?) {<br />
		my $h = sqrt( $a*$a + $b*$b );<br />
		$txt //= 'Länge:<br />
		say &quot;$txt $h.&quot;;<br />
		return $h;<br />
	}</p>
<p>
oder</p>
<p>
	Num+ sub hypotenuse (Num+ $a, Num+ $b, Str $txt = 'Länge: ') {<br />
		my $h = sqrt( $a*$a + $b*$b );<br />
		say &quot;$txt $h.&quot;;<br />
		return $h;<br />
	}</p>
<p>
Da optionale Parameter auch an der Zuweisung erkannt werden, darf das Fragezeichen <br />
im letzten Beispiel weggelassen werden. Das Gegenteil des Fragezeichens ist das<br />
Ausrufezeichen (siehe dem Bedingunsoperator C&lt;?? !!&gt;) Deshalb werden notwendige<br />
Parameter mit einem angehängten C&lt;$var!&gt; deklariert, was aber bei positionalen<br />
Parametern nicht notwendig, da default ist.</p>
<h3 id="schl_C3_BCrfende_parameter">Schlürfende Parameter</h3>
<p>
Manchmal ist es aber auch praktisch eine unbekannte Anzahl von Parametern in einem<br />
Array zusammenzufassen. Dies erreicht man durch einen Stern als Präfix:</p>
<p>
	sub summe (*@a) { <a href="http://www.perlfoundation.org/perl6/index.cgi?%2B" title="[click to create page]" class="incipient">+</a> @a }</p>
<p>
Aber auch Hashes und Skalare aller Art dürfen als &quot;slurpy&quot; deklariert werden. Im<br />
folgenden Beispiel implementieren wir Perl's map-Funktionen. Mit dem Unterschied,<br />
daß bei unserem C&lt;map&gt; der anonyme Block an beliebiger Stelle stehen darf und der<br />
der Interpreter anhand der Signatur die Parameter passend zuordnet.</p>
<p>
	sub map (<strong>&amp;code,</strong> @werte) {<br />
		return gather for @werte -&gt; $wert {<br />
			take $code($wert);<br />
		}<br />
	}</p>
<p>
Würde die Sigantur C&lt;(<strong>@werte,</strong> &amp;code)&gt; lauten, müsste der Block immer an letzter<br />
Stelle übergeben werden.</p>
<h3 id="benannte_parameter">Benannte Parameter</h3>
<p>
Wie angedeutet waren alle bisherigen Parameter positional, richten sich also nach<br />
der Reihenfolge im Funktionsaufruf.</p>
<p>
	sub hypotenuse ($a, $b) {<br />
		sqrt( $a*$a + $b*$b );<br />
	}</p>
<p>
Selbst bei einem Aufruf wie C&lt;hypotenuse($b, $a)&gt; würde der Inhalt der Variable<br />
C&lt;$b&gt; in den Parameter C&lt;$a&gt; kopiert werden und analog Variable C&lt;$a&gt; in C&lt;$b&gt;.<br />
Es gibt jedoch sehr gute Gründe Parameter manchmal direkt beim Namen anzusprechen.<br />
Der Quellcode wird nachvollziehbarer und nicht jeder kann sich die Reihenfolge<br />
von 12 Parametern für jede Routine oder Methode merken. Oft ist auch nicht die<br />
Eingabe von jedem Parameter notwendig, aber wie sag ichs dem Computer, daß ich<br />
diemal gerne die Parameter 3, 5 und 12 übergebe. Selbst die bereits vorgestellten<br />
optionalen Parameter waren positional. Aus der Überlegung erschließt sich auch<br />
warum in Perl 6 benannte Parameter per default optional sind. Wie bekannt kann<br />
das angehängte C&lt;!&gt; sie erzwingen. Benannte Parameter erkennt man am Präfix C&lt;:&gt;.<br />
Und sehr zu beachten: sie folgen den positionalen Parametern in der Signatur.</p>
<p>
	sub new(:$parent, :$ID, :$value :@size, :@pos, :@item, $:style)</p>
<p>
Es gab Moment, da wünschte ich mir beim WxPerl-Programmieren Perl 6 wäre schon da<br />
und z.B. die C&lt;new&gt;-Methode einer Combobox hätte eine solche Signatur. Weil beim<br />
erzeugen des Widget sind bei mir nur die Eltern (Platz in der Objekthierarchie)<br />
und der Sytle (Aussehen und Verhalten) wichtig. Die ID lass ich autogenerieren,<br />
Größe und Position bestimmen die Sizer und Textwert und die Item werden bei Bedarf<br />
gesetzt.</p>
<p>
	my $cb = Wx::Combobox.new( parent =&gt; $win, :style($style) );</p>
<p>
So würde mir das gefallen. Zu Demonstrationszwecken enthält das letzte Beispiel<br />
beide Paar-Schreibweisen. Sie wurden bereits in der vorigen Folge erläutert. Nur<br />
ließe sich hier C&lt;:style($style)&gt; auch zu C&lt;:$style&gt; zusammenfassen.</p>
<p>
Hat eine Routine keine Signatur, erhält sie ihre mt Namen zugewiesenen Parameter<br />
aus C&lt;%&gt;, so wie C&lt;@&gt; nur die positionalen Parameter enthält. Verwendet man<br />
Platzhalter-Variablen wie C&lt;$^a&gt; in Routinen ohne Signatur (obwohl die nur für<br />
einfache Blöcke gedacht sind), erscheinen die Werte dieser Variablen nicht mehr<br />
in C&lt;%&gt; oder C&lt;@&gt;.</p>
<p>
Möchte man ein Paar als positionalen Parameter angeben, muß er in runde Klammern<br />
gesetzt werden. Wie nachfolgend zu sehen, kann man die umschließenden Klammern<br />
einer Signatur meist weggelassen werden.</p>
<p>
	# Aufruf mit einem positionalem Argument<br />
	Wx::Combobox.new (:parent&lt;$win&gt;), ;</p>
<p>
Ich weiß auch: Tk und viele andere Module kennen heute bereits benannte Parameter.<br />
Die Übergabe eines anonymen Hashes hat zumindest optische Ähnlichkeiten, Typen <br />
und Anzahl der Geforderten Parameter werden dabei nicht geprüft. In Perl 6 könnte<br />
man aber auch eine Routine mit einem Hash aufrufen. Damit Perl die Paare des Hashs<br />
als Name und Wert benannter Parameter wertet muss der mit einem senkrechten Strich<br />
dereferenziert werden.</p>
<p>
	Wx::Combobox.new( |%default );</p>
<p>
&quot;|&quot; ist keine Sigil für einen Datentyp, so wie ein &quot;&amp;&quot; für Codereferenzen steht,<br />
es dient lediglich zum interpoliert in den Capture-Kontext, vergleichbar mit &quot;@@&quot;,<br />
daß für den bereits behandelten slice- oder auch multislice-Kontext steht.</p>
<h3 id="was_zum_sind_capture">Was zum $@%&amp; sind Capture?</h3>
<p>
Von allen Neuheiten in Perl 6 fordern I&lt;Capture&gt; wohl am stärksten die Fähigkeit<br />
sich neue Nervenverbindungen wachsen zu lassen, denn soweit mir bekannt, gibt es<br />
nichts Vergleichbares in anderen Sprachen. Ein Capture ist ein Datentyp, der einem<br />
Skalar zugewiesen wird und alle Parameter eines Routinenaufrufs speichern kann.<br />
Da Signaturen sowohl positionale als auch benannte Parameter haben können, <br />
erscheinen Capture anfangs als seltsame Hybride aus Array und Hash. Nur anders<br />
als die Letztgenannten kann eine Capture nicht nachträglich verändert werden.<br />
Sie ist &quot;immutable&quot; wie eine Liste. Weil es jetzt keine Referenzen mehr gibt<br />
bekamen Capture den &quot;\&quot; vererbt, der von nun an &quot;capture composer&quot; heißt.</p>
<p>
	my (@a, $b, %c) = <a href="http://www.perlfoundation.org/perl6/index.cgi?1%20..%205" title="[click to create page]" class="incipient">1 .. 5</a>, 6, {'sonnen' =&gt; 'schein'};<br />
	$capture = \(@a, $b, %c);</p>
<p>
Diese Capture enthält keine Referenzen auf die Variablen sondern nur die Inhalte.</p>
<p>
Anstatt zu referenzieren kann man in Perl 6 einen Alias auf eine Variable in der<br />
Symboltabelle erstellen. Dies geht mit einem sehr einfachen Syntax und gänzlich<br />
ohne Typeglobs.</p>
<p>
	$alias := $kathete;<br />
	$kathete = 5;<br />
	say $alias; # ist 5<br />
	# bindet während Kompilierung<br />
	$alias ::= $kathete;</p>
<h3 id="multi_sub_s">Multi Sub's</h3>
<p>
Erinnern wir uns des ersten Beispiels. Wollte man eine Routine schreiben die die<br />
Länge einer beliebigen Seite des rechtwinkligen Dreiecks berechnet, würden die<br />
bisher vorgestellten Mittel nicht ausreichen. Mit benannten Parametern wäre die<br />
richtige Zuordnung der Seiten gesichert, aber nicht die Forderung, daß 2 von 3<br />
gegeben sein müssen. Eine Lösung bestünde darin das Problem aufzuteilen, was Perl<br />
völlig neue Möglichkeiten eröffnet:</p>
<p>
	multi sub pythagoras (:$kathete!, :$kathete!) {<br />
		sqrt(@kathete[0]**2 + @kathete[1]**2);<br />
	}</p>
<p>
	multi sub pythagoras (:$kathete!, :$hypotenuse!) {<br />
		sqrt($hypotenuse**2 - $kathete**2);<br />
	}</p>
<p>
Das Schlüsselwort C&lt;multi&gt; kündigt an, daß es mehrere Routinen gleichen Namens<br />
gibt. Mit einem C&lt;only&gt; könnte ausschließen, das nachträglich noch eine C&lt;multi&gt;<br />
zu einem Namen deklariert wird. Das ist aber meist nicht notwendig, da normale<br />
C&lt;sub&gt; per default &quot;C&lt;only&gt;&quot; sind.</p>
<p>
Wird die Routine mit C&lt;pythagoras( :kathete&lt;3&gt;, :hypotenuse&lt;5&gt; );&gt; aufgerufen,<br />
prüft der Interpreter welche Signatur zu den Parametern passt. Manch einer ahnt<br />
es schon. Auch dafür wird intern wie bei C&lt;gigen/when&gt; der &quot;smartmatch&quot; benutzt.<br />
Es kann auch sehr praktisch sein selbst zu überprüfen ob ein Satz von Parametern<br />
bei einer Routine Erfolg gehabt hätte.</p>
<p>
	$capture ~~ &amp;routine.signature;</p>
<h3 id="parameter_traits">Parameter Traits</h3>
<p>
Alle bisherigen Paramter konnten in der Routine nicht verändert werden, was meist<br />
sinnvoll ist, aber zuweilen unpraktisch. In diesen Fällen können einzelne Parameter<br />
als veränderbar (rw steht für read/write) gekennzeichnet werden, was einer &quot;&lt;-&gt;&quot;<br />
Zuweisung in I&lt;Pointy-Blocks&gt; entspricht.</p>
<p>
	sub incr (*@vars is rw) { $_++ for @vars }</p>
<p>
Der Befehl C&lt;is&gt; definiert I&lt;Traits&gt; (Charakteristiken) von Variablen. Das sind<br />
neben dem Inhalt zusätzliche Werte oder Eigenschaften die zur Kompilierungszeit<br />
Variablen gegeben werden können. Im Gegensatz dazu werden mit C&lt;but&gt; I&lt;Properties&gt;<br />
(zusätzliche Laufzeiteigenschaften) bestimmt. Somit wird der alte Perl 5-Witz<br />
&quot;0 but True&quot; lauffähiger Code.</p>
<p>
Eine andere Möglichkeit veränderbare Parameter zu erhalten ist der Trait C&lt;copy&gt;.<br />
Wie der Name aussagt sind solche Parameter veränderbare Kopien der übermittelten<br />
Variablen.</p>
<h3 id="eingewickelte_routinen">Eingewickelte Routinen</h3>
<p>
Es gibt sogar Situationen da muß man eine Signatur rückwirkend anpassen. Unsere<br />
großartige C&lt;hypotenuse&gt;-C&lt;sub&gt; könnte Teil eine Matematik-Bibliothek sein die<br />
wir benutzen wollen. Sie kann sogar die Hypotenuse berechnen, wenn ein Winkel und<br />
die gegenüberliegende Seitenlänge gegeben ist. Nur leider rechnet sie mit I&lt;gon&gt;<br />
(Neugrad) und unser Programm mit I&lt;Grad&gt; (Altgrad). Die Bibliothek zu verändern<br />
kommt nicht in Frage, da die Patches in jede neue fehlerreduzierte Version der<br />
Bibliothek eingepflegt werden müssten. Zum Glück gibt es auch dafür in Perl 6<br />
eine elegante Lösung.</p>
<p>
	sub hypotenuse($l, $winkel) {...}<br />
	$handle = &amp;hypotenuse.wrap( { callwith( $^l, $^winkel/360*400 ) } );<br />
	# funktioniert einwandfrei<br />
	hypotenuse(2,20);<br />
	&amp;hypotenuse.unwrap($handle);</p>
<p>
Der letzte Befehl hebt die Umhüllung auf und es können selbstverständlich beliebig<br />
viele Umhüllungen stattfinden. Sind irgendwelche andere Vor- und Nachbereitende<br />
Tätigkeiten auszuführen und die Parameter sollen unverändert an die ursprüngliche<br />
Routine weitergereicht werden, kann man statt C&lt;callwith&gt; auch C&lt;callsame&gt; nehmen.<br />
Beide Befehle liefern die Ergebnisse der originalen Routine, die dann noch nach<br />
Wunsch nachbereitet werden können.</p>
<h3 id="r_C3_BCckgabekontext">Rückgabekontext</h3>
<p>
Nachbearbeitungen werden aber oft vermieden, wenn die Routine auf den Kontext<br />
eingeht in dem sie gerufen wird. Das ist meist eine Signatur über alle Variablen,<br />
denen das Ergebnis der Routine zugewiesen wird. Diese Signatur erhält man mit dem<br />
Befel C&lt;caller.want&gt; und man könnte ohne Damian Conways Modul I&lt;Contextual::Return&gt;<br />
schreiben:</p>
<p>
 given caller.want {<br />
 when :($) {...} # Skalarkontext<br />
 when :(*@) {...} # Arraykontext<br />
 when :($ is rw) {...} # Ein lvalue wird erwartet<br />
 when :($,$) {...} # 2 Werte werden erwartet<br />
 ...<br />
 }</p>
<p>
Für all das gibt es auch noch eine andere Schreibweise.</p>
<p>
 if want.item {...} <br />
 elsif want.list {...} <br />
 elsif want.void {...} <br />
 elsif want.rw {...}</p>
<p>
Dieser Kontexte gibt es noch vieler mehr. Auch ist C&lt;.want&gt; bei weitem nicht die<br />
einzigste Methode zur Introspektion, aber ich will hier kein Handbuch schreiben,<br />
sondern nur einige Möglichkeiten andeuten. Eine vollständige Auflistung aller<br />
Details soll das Tutorial in der Wiki unter<br />
<a target="_blank" title="(external link)" href="http://wiki.perl-community.de/bin/view/Wissensbasis/PerlTafel">http://wiki.perl-community.de/bin/view/Wissensbasis/PerlTafel</a> werden. In diesem<br />
Beispiel wäre ein C&lt;want&gt; anstatt C&lt;caller.want&gt; ausreichend gewesen, aber würde<br />
der C&lt;return&gt;-Befehl innerhalb eines Blocks stehen, wären C&lt;caller.want&gt; und<br />
C&lt;context.want&gt; verschieden.</p>
<p>
C&lt;return&gt; verlässt immer die innerste umgebende Routine. Wird lediglich gewünscht<br />
den Block zu verlassen, empfiehlt sich C&lt;leave&gt; zu nehmen. Logischerweise wird nur<br />
der Rückgabewert von C&lt;return&gt; gegen die Signatur der innersten Routine &quot;gematcht&quot;.</p>
<h3 id="module_und_scope">Module und Scope</h3>
<p>
Was wäre Perl ohne Module. Deshalb bietet Perl 6 auch für Modulauthoren etliche<br />
Verbesserungen zur Vorgängerversion. Da aber in diesem Bereich vieles noch nicht<br />
in trockenen Tüchern ist, jetzt nur einige Grundzüge. Mit C&lt;package&gt; werden <br />
weiterhin Namensräume definiert, für Namensräume mit zusätzlichen Eigenschaften<br />
gibt es jetzt C&lt;module&gt;. Der Befehl C&lt;module Name;&gt; besagt, daß für den Rest der<br />
Datei der Namensraum I&lt;Name&gt; gilt. Für mehrere Module in einer Datei schreibe man<br />
C&lt;module Name{ ... }&gt;. So können Namensräume auch verschachtelt werden und mit<br />
C&lt;my module Name { ... }&gt; Module sogar als lexikalisch lokal bestimmt werden.<br />
Analog dazu dürfen auch Subroutinen jetzt mit C&lt;my&gt; lokal sein. Standartmäßig<br />
entspricht aber weiterhin ein C&lt;sub routine {...}&gt; einem C&lt;our sub routine {...}&gt;.</p>
<p>
Eine der Hauptfähigkeiten von Modulen ist das Exportieren von Routinen. Dazu<br />
benötigt man kein C&lt;use Exporter;&gt; mehr, sondern markiert die entsprechenden<br />
Routinen mit einer I&lt;Trait&gt; als C&lt;is export&gt;. C&lt;sub&gt;-Traits haben ihre Position<br />
nach der Signatur. Module werden wie bekannt mit C&lt;use&gt; oder C&lt;require&gt; geladen,<br />
jedoch wurden auch diese Befehle wesentlich mächtiger um einige Probleme zu lösen<br />
die ein wachsendes CPAN mit sich bringt.</p>
<p>
 use Dog:&lt;1.2.1&gt;;</p>
<p>
So fordert man z.B. eine spezielle Version an. Noch genauer wäre:</p>
<p>
 # bitte keine Version 1.2.7<br />
	use Dog:ver(1.2.1..^1.2.7);</p>
<p>
Auch ein optionaler Mechanismus zur Authentifizieren von Autoren ist im Syntax<br />
vorgesehen, jedoch noch nicht voll ausgereift.</p>
<p>
Namensräume mit weitaus mehr Eigenschaften werden mit C&lt;class&gt; erzeugt. Die OOP<br />
wird aber Stoff der nächsten Folge sein.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_4" title="(34 months)  toc Still operators left Nach Operatoren f r Skalare und Operatoren f r Arrays ist sicher Operatore...">Previous Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 4 --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(39 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_6" title="(34 months)  toc Objects and Roles Willkommen und hereinspaziert mein Damen und Herren. Hier erleben sie Mensche...">Next Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 6 --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_5</guid>
<pubDate>Fri, 06 Aug 2010 23:53:55 -0000</pubDate>
</item>

<item>
<title><![CDATA[Perl 6 Tutorial Part 8]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_8</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#wozu_metaprogrammierung">Wozu Metaprogrammierung?</a><!-- wiki: {link: [] Wozu Metaprogrammierung?} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#wo_beginnt_metaprogrammierung">Wo beginnt Metaprogrammierung ?</a><!-- wiki: {link: [] Wo beginnt Metaprogrammierung ?} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#die_wunderbare_welt_der_macros">Die wunderbare Welt der Macros</a><!-- wiki: {link: [] Die wunderbare Welt der Macros} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#da_entlang_alice">Da entlang Alice</a><!-- wiki: {link: [] Da entlang Alice} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#zeig_mir_dein_inneres">Zeig mir dein Inneres!</a><!-- wiki: {link: [] Zeig mir dein Inneres!} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#was_sich_sonst_noch_tat">Was sich sonst noch tat</a><!-- wiki: {link: [] Was sich sonst noch tat} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><p>
Herzlich willkommen auch zum achten und letzten Teil dieses tiefsch�rfenden<br />
Tutoriums f�r werdende Perl 6-Programmierer. Diesmal wird es sogar noch eine Ebene<br />
tiefer gehen, zu den Interna der Sprache und wie sie befragt und ver�ndert werden.<br />
Da diese Bereiche st�rker theorielastig sind und von Pugs und Rakudo bisher kaum<br />
implementiert werden, besteht diese Folge aus mehr Text und weniger Beispielen<br />
als �blich.</p>
<h3 id="wozu_metaprogrammierung">Wozu Metaprogrammierung?</h3>
<p>
Von Anfang an ging es bei diesem Projekt nicht nur darum vergangene Irrt�mer<br />
auszub�geln und den aktuellen Stand dynamischer Sprachen in vielem wieder ein- und<br />
�berholen. Perl 6 sollte auch nach l�ngerer Reifung ebenfalls lange halten. Was<br />
bedeutet, da� die Sprache f�hig sein mu�, k�nftige Anpassungen zu unterst�tzen,<br />
ohne das die Implementation des Interpreters angefasst werden wird. Einfacher<br />
gesagt: Perl 6 sollte bessere M�glichkeiten der Metaprogrammierung erhalten,<br />
als die derzeit ber�chtigten I&lt;Sourcefilter&gt;, die abgeschafft wurden, da sie viel<br />
zu langsam und fehleranf�llig sind, um in echtem Produktionscode eingesetzt zu werden.</p>
<p>
Das ganze hat aber noch eine anderen Grund. Viele der weitverbreiteten Sprachen<br />
haben etliche Varianten oder auch Ableger, da verschiedene Fachbereiche oder<br />
Anwendergruppen verschiedene Betrachtungsweisen kennen oder bevorzugen.<br />
Um die Aufsplitterung von Perl in Derivate wie es z.B. mit PHP geschah zu verhindern,<br />
mu� Perl noch wandlungsf�higer werden.<br />
Und nur eine gemeinsame Basis macht eine Infrastruktur und damit alle Beteiligten<br />
wirklich m�chtig (siehe CPAN).<br />
Gerade in den letzten Jahren wird das mit dem Modewort I&lt;domain specific language&gt;<br />
(DSL) zusammengefasst, wenn Sprachen einer Aufgabenstellung angepasst werden k�nnen,<br />
um diese effektiv und f�r die mit der Materie Vertrauten verst�ndlich zu l�sen.<br />
Flexibilit�t (TIMTOWTDI) hatte sich Perl schon immer auf die Fahnen geschrieben<br />
und dies wird mit Perl 6 nur noch etwas weiter getrieben. Perl 6 ist in Wirklichkeit<br />
eine Metaprogrammiersprache, die sich zur Laufzeit in fast alles Denkbare verwandeln<br />
kann. Dies ist in Ordnung so, mein Larry Wall, da alles erlaubt sein soll,<br />
wenn man es vorher explizit deklariert. Und Lernende werden mit einem ausgewogenem<br />
Satz vordefinierter Befehle zu einem &quot;guten Stil&quot; angeleitet, bis sie f�hig werden,<br />
alle Regeln zu ver�ndern. Und je mehr sie lernen diese Regeln zu ihrem Vorteil<br />
zu �ndern, umso k�rzer, effektiver und oft auch lesbarer werden ihre Programme.</p>
<p>
Dieser Ansatz bringt nicht nur Freiheit f�r den Programmierer sondern erlaubt die<br />
immer komplexer werdenden Softwaresysteme kompakter und beherrschbarer zu schreiben.<br />
Ein Blick in die Java-Welt zeigt die Nachteile hierarchisch-logischer Strukturen,<br />
die oft zu unbeweglich und �berladen und damit schwer lesbar und ver�nderbar sind.<br />
Aber selbst in der Welt von Perl und Ruby lernte man in den letzten Jahren, da�<br />
die zuerst gepriesenen Web-Frameworks schnell sehr umfangreich werden. Jedes ist<br />
eine Welt f�r sich, die erlernt sein will, obwohl sich viel Funktionalit�t �hnelt.<br />
Deshalb entstanden in letzer Zeit mit Rack, Mojo und anderen Unterfangen Software,<br />
die sich auf einzelne Probleme konzentriert, um diese in logischen Einheiten mit<br />
eine m�glichst einfachen API handhabbar zu halten. Die Idee dahinter ist nicht neu,<br />
denn Perl 1.0 brachte Shellbefehle in die C-Syntax brachte, um komplexere Probleme<br />
kurz und und dem menschlichen Denken nah zu l�sen. Sp�ter erf�llten in Perl 5.n<br />
gute Module den gleichen Zweck, nur das sie bereits von Programmierern der Sprache<br />
zugef�gt werden konnten, ohne den C-Quellcode von Perl anzufassen. Das neue Perl 6<br />
ist eine logische Fortsetzung dieser Entwicklung zu einer Sprache die quasi &quot;fl�ssig&quot; ist,<br />
und in verschiedene Situationen die Syntax annehmen kann, der dem Ideal des Benutzers<br />
entspricht. Dadurch fallen Barrieren, die bisher durch Programmiersprachgrenzen<br />
aufgestellt wurden. Gro�e Systeme bestehen zunehmend aus Teilen die in verschiedenen<br />
Sprachen und Versionen geschrieben wurden, die sich nur in Details unterscheiden<br />
k�nnen, aber dennoch von zus�tzlicher I&lt;Middleware&gt; &quot;zusammengehalten&quot; werden m��en.<br />
Diese Teilsystem werden oft kaum mehr angefasst, da sie ausgereift, zuverl��ig<br />
aber nicht immer leicht wartbar und auch nicht leicht erneuerbar sind. Deshalb<br />
wachsen diese Flickenteppiche zu ungeahnten Komplexit�ten und es gibt bereits<br />
Lehrst�hle f�r Professoren, die Menschen beibringen wollen mit solchen Unget�men<br />
umzugehen. Besser w�re es doch, wenn solche Software gleich in Perl 6, vielleicht<br />
auch Ruby oder Lisp geplant wird, um diese Komplexit�t nicht entstehen zu lassen.<br />
Und selbst wenn &quot;unber�hrbare&quot; Software Teil einer Anwendung ist, kann eine sehr<br />
anpassungsf�hige Sprache Kommunikation mit wenig Programmieraufwand erm�glichen,<br />
und Perl bleibt was es immer war: eine I&lt;glue-language&gt;.</p>
<h3 id="wo_beginnt_metaprogrammierung">Wo beginnt Metaprogrammierung ?</h3>
<p>
Wenn eine kleine I&lt;sub&gt; den verf�gbaren Wortschatz erweitert, ist das bereits<br />
Metaprogrammierung? Das kommt auf den Fall an. Subroutinen k�nnen dazu verwandt<br />
werden etwas Ordnung in Spaghetticode zu bringen, was unter das Schlagwort<br />
&quot;strukturierte Programmierung&quot; f�llt. Da die Errungenschaften von C&lt;if&gt;, C&lt;while&gt;<br />
und Routinen seit den 70er-Jahren Allgemeingut wurden, f�llt der Begriff heute selten.<br />
Wesentlich h�ufiger h�rt man dieser Tage dagegen das Wort &quot;funktionale Programmierung&quot;.<br />
So hei� ein Programmierstil der sehr abstrakt ist und daher in die Metaprogrammierung<br />
hineinragt. Mark Jason Dominus beschreibt in &quot;Higher Order Perl&quot; genauer wie das<br />
in Perl aussieht (Buchrezension in $foo Winter/2008). Das Buch ist wohl zum Teil<br />
nach den &quot;Higher Order Functions&quot; benannt. Das sind Routinen die eine Aufgabe<br />
sehr abstrakt l�sen und deshalb sehr vielseitig einsetzbar sind. Viele Perlianer<br />
verwenden bestimmt solche &quot;Higher Order Functions&quot;, ohne den Begriff zu kennen.<br />
Z.B. C&lt;map&gt; und C&lt;grep&gt; fallen in diese Kategorie. Aber mit Perl 5.0 konnte man<br />
auch bereits selber solche Functionen schreiben, da schachtelbare Namensr�ume f�r<br />
Variablen und Codereferenzen als Parameter anwendbar waren. �hnlich der OOP war<br />
in Perl 5 fast alles m�glich, nur vieles jetzt einfacher. Eine wichtige Technik<br />
in der funktionalen Programmierung ist z.B. das I&lt;Currying&gt;. Auf deutsch: das <br />
Erstellen einer Codereferenz auf eine Funtion h�herer Ordnung (einen Alias), bei<br />
der bestimmte Parameter festgelegte Werte haben und nur die restlichen Parameter<br />
bestimmt werden k�nnen. Also wenn eine Funktion C&lt;potenz&gt; beliebige Potenzen<br />
berechnet(ja es ginge auch mit C&lt;**&gt;, aber folgender Code entspricht einem<br />
funktionalem L�sungsansatz):</p>
<p>
	subset Num+ of Num where { $_ &gt; 0 };<br />
	subset Num- of Num where { $_ &lt; 0 };<br />
	subset Zero of Num where { $_ == 0 };</p>
<p>
	multi sub potenz (Num :$basis!, Zero :$exponent!) {<br />
		return 1;<br />
	}</p>
<p>
	multi sub potenz (Num :$basis!, Num- :$exponent!) {<br />
		return 1 / potenz( $basis, -$exponent);<br />
	}</p>
<p>
	multi sub potenz (Num :$basis!, Num+ :$exponent!) {<br />
		return $exponent * potenz( $basis, $exponent - 1 );<br />
	}</p>
<p>
Ein Funktion C&lt;quadrier&gt; w�rde ich nun explizit wie folgt erhalten:</p>
<p>
	&amp;quadrier := &amp;potenz.assuming( exponent =&gt; 2 );<br />
	# alternative Schreibweise:<br />
	&amp;quadrier := &amp;potenz.assuming( :exponent(2) );</p>
<p>
Die l��t sich wie erwartet aufrufen:</p>
<p>
	say quadrier(5); # ergibt 25</p>
<p>
C&lt;.assuming&gt; (englisch f�r angenommen) dr�ckt in einer Alltagssprache genau aus<br />
worum es hier geht: C&lt;quadrier&gt; entspricht C&lt;potenz&gt;, unter der Annahme, da� der<br />
Exponent 2 ist. Das C&lt;:=&gt; ist keine Zuweisung sondern ein I&lt;binding&gt;. P6 kennt<br />
weder direkten Manipulation der Symboltabelle mit Typeglobs noch Referenzen (der<br />
Schr�gstrich (I&lt;backslash&gt;) erzeugt jetzt I&lt;captures&gt;, siehe Teil 6). Um einen<br />
Alias auf den Inhalt einer Variable zu erhalten, bindet man diese Variable mit<br />
C&lt;:=&gt; an eine Andere.</p>
<p>
	my $planeten = 7;<br />
	my $planety := $planeten;<br />
	$planeten = 9;<br />
	say $planety; # gibt 9<br />
	say &quot;yes&quot; if $planety =:= $planeten;</p>
<p>
Das letzte Beispiel f�hrt die Ausgabe aus, da die Variablen an das gleiche Objekt<br />
gebunden sind. Ein Binden zur Kompilierungszeit mit der Schreibweise C&lt;::=&gt; mag<br />
selten gebraucht werden, aber das Ausf�hren von Routinen zum fr�hstm�glichen<br />
Zeitpunkt wesentlich �fter. In Perl 5 schrieb man dazu den Code in einen BEGIN-Block,<br />
was weiterhin m�glich ist, aber Perl 6 kennt noch ein anderes Konzept, das dem<br />
�hnelt, aber weitaus m�chtiger ist. Manche behaupten sogar, da� vor allem diese<br />
Macros LISP m�chtiger machen als alle anderen Sprachen, was in den 60er und 70er<br />
Jahren auch gestimmt haben mag.</p>
<h3 id="die_wunderbare_welt_der_macros">Die wunderbare Welt der Macros</h3>
<p>
Macros sind (wie angedeutet) Routinen, die beim Kompilieren ausgef�hrt werden.<br />
Im Gegensatz zu einer C&lt;sub&gt;, �ndern sie die Sprache, da sie statt eines Wertes,<br />
einen AST (Baumstruktur, die als Zwischenform beim Kompilieren entsteht) liefern,<br />
der beim Kompilieren anstelle jedes Macroaufrufes in den AST des Programmes<br />
eingef�gt wird, bevor die Ausf�hrung beginnt.</p>
<p>
In C ist das bei weitem einfacher. Hier sind Macros lediglich Textbausteine die<br />
an die mit dem Makronamen markierten Stellen im Quellcode eingef�gt werden, bevor<br />
der Kompiler sein Werk beginnt. Die alten Perl 5-Sourcefilter taten ihr Unwesen<br />
nach dem gleichen Prinzip, nur da� hier die volle Kraft der P5-Regex am Werke war.<br />
Das kann subtile, schwer zu entdeckende Fehler erzeugen, da jeder Macroprozessor<br />
blind f�r die Bedeutung der Sprachsyntax ist und der von ihm erstellte Quelltext<br />
nirgends einsehbar ist. Perl 6-Macros haben standardm��ig (wie alle Bl�cke) keine<br />
Seiteneffekte auf die lexikalische Struktur der umgebenden Quellen.<br />
So etwas nennt die Fachwelt: hygienische Macros. Folgende Makros sind hygienisch:</p>
<p>
	macro summe { 3 + 4 }<br />
	macro summe { '3 + 4' }<br />
	macro summe is parsed { 3 + 4 }</p>
<p>
C&lt;parsed&gt; ist ein Trait von Routinen da� nur Macros wirklich ben�tigen, aber da<br />
es default ist, kann es auch weggelassen werden. Und auch die Verwendung der <br />
Macros ist denkbar einfach.</p>
<p>
	say 2 * summe; # 14<br />
	say 2 * summe(); # 14<br />
	say 2 * &amp;summe(); # 14</p>
<p>
Auch wenn alle Aufrufe C&lt;14&gt; ergeben, so sind sie nicht identisch, da der dritte<br />
erst zur Laufzeit aufgel�st wird. Doch manchmal sind dreckige Macros genau was<br />
man m�chte und dann schreibt man.</p>
<p>
	macro summe is reparsed { 3 + 4 }</p>
<p>
Wird dieses Macro im vorigen Beispiel aufgel�st, hie�e das Ergebnis C&lt;10&gt;.<br />
Denn dieses Macro gibt nur einen String zur�ck, der zusammen mit dem umgebenden<br />
Quellcode compiliert wird. Dabei gilt die alte Regel: Punkt- vor Strichrechnung.<br />
Da diese Funktionsweise derartige Probleme provoziert, hat sie die beschriebene<br />
Kindersicherung und es wird standardm��ig von Macros ein AST zur�ckgegeben.<br />
Aber auch au�erhalb von Macros kann dies getan werden. I&lt;quoting&gt; mit dem Adverb<br />
C&lt;:code&gt; (siehe letzte Folge) und ein C&lt;quasi&gt; vor geschweiften Klammern oder <br />
Anf�hrungszeichen kann das (I&lt;quasiquoting&gt;) bewirken.</p>
<p>
	return quasi { say &quot;foo&quot; };<br />
	return Q :code / say &quot;foo&quot; /;</p>
<p>
Beide Zeilen liefern keine Referenz auf eine Routine sondern ein kompiliertes<br />
St�ck Programm. Folglich ist ein Macro eine zu C&lt;BEGIN&gt; ausgef�hrte Routine<br />
deren R�ckgabewert derart C&lt;quasi&gt; kommentiert (I&lt;gequoted&gt;) ist. Dies ist eine<br />
sehr elegante Eigenschaft von Perl 6, da� jedes Sprachelement mit den Bordmitteln<br />
der Sprache beschrieben werden kann. Deswegen kann die Syntax, so reichhaltig sie<br />
auch scheinen mag, auf einen wesentlich kleineren Kern reduziert werden, aus dem<br />
sich beliebige Sprachen aufbauen lassen. Deshalb gilt f�r Perl 6 was John Foderaro<br />
einst �ber Lisp sagte: &quot;es ist eine programmierbare Programmiersprache&quot;.<br />
Weil Perl syntaktisch viel reichhaltiger als Lisp ist, da� nur Funktionsnamen,<br />
Wertelisten und runde Klammern kennt, m��en Perl-Macros wesentlich mehr k�nnen,<br />
um wirklich alle Sprachbestandteile erweitern zu k�nnen. Einen neuer Operator<br />
(z.B. f�r die mathematische Fakult�t-Funktion) wird so erzeugt:</p>
<p>
	macro postfix:&lt;!&gt; { <a href="http://www.perlfoundation.org/perl6/index.cgi?*" title="[click to create page]" class="incipient">*</a> 1..$^n }<br />
	macro postfix:('!') { <a href="http://www.perlfoundation.org/perl6/index.cgi?*" title="[click to create page]" class="incipient">*</a> 1..$^n }</p>
<p>
Das gew�hlte Operatorsymbol kann auch in andere Klammern als den Spitzen geh�llt<br />
sein, aber der Vorsatz &quot;postfix:&quot; ist entscheidend, da wir einen Postfix-Operator,<br />
also einen nachgestellten Operator (wie in C&lt;$p++&gt;) definieren wollen. Um noch zu<br />
bestimmen wo der neue Operator seinen Platz in der Vorrangtabelle hat, k�nnte man<br />
hinzuf�gen:</p>
<p>
	macro postfix:&lt;!&gt; is equiv(&amp;postfix:&lt;++&gt;) { ... }</p>
<p>
Das k�nnte man auch mit C&lt;is tighter&gt; oder C&lt;is looser&gt; definieren. Dann bek�me<br />
der Operator eine eigene Spalte in der Vorrangtabelle die jeweils �ber oder unter<br />
dem angegebenen Operator liegt.</p>
<p>
Diesem Schema entsprechend gibt es eine lange Reihe von Schl�sselw�rter die jede<br />
Art von Operator oder Schl�sselwort bezeichnen. Es lassen sich eigne Arten des<br />
I&lt;Quoting&gt;, Regex-Befehle, Spezialvariablen oder neue sekund�re Sigils einf�hren.<br />
Wenn jemand XML-Kommentare in seinem Perl haben m�chte so reicht ein:</p>
<p>
	macro circumfix:�&lt;!-- --&gt;� ($text) is parsed / .*? / { &quot;&quot; }</p>
<p>
C&lt;$text&gt; ist der Parameter, der den Text zwischen den Kommentarzeichen beinhaltet.<br />
Nach dem C&lt;is parsed&gt; steht die Regex mit der geparsed werden soll. In diesem<br />
Fall hat das &lt;reparsed&gt; den Vorteil, da� die Regex mit Regeln formuliert werden<br />
kann die erst sp�ter definiert werden.</p>
<h3 id="da_entlang_alice">Da entlang Alice</h3>
<p>
Aber die Manipulation der Sprache kennt noch eine Ebene. Es ist sogar m�glich<br />
die Regeln zu �ndern mit denen der Interpreter den Quellcode einliest. Seine<br />
Arbeitsweise wird in der STD.pm mit der Hilfe von P6-Regex-Grammatiken definiert.<br />
Wie diese formuliert werden und aufgebaut sind, behandelte die letzte Folge.</p>
<p>
Intern wird die Sprache in mehrere Teilsprachen (&quot;slangs&quot;) gegliedert. <br />
Die Kernsprache ist z.B. eine Grammatikobjekt, auf das mit C&lt;$~MAIN&gt; zugegriffen<br />
werden kann. Die Regeln f�r das Kommentieren stehen unter C&lt;$~Q&gt;.<br />
Und die Regex die bestimmen wie Regex einzulesen sind, finden sich unter C&lt;$~Regex&gt;.<br />
C&lt;~&gt; ist die Twigil dieser Sondervariablen. Und da Grammatiken nach au�en normale<br />
Objekte sind, k�nnen sie abgeleitet und ver�ndert werden wie jedes andere Objekt<br />
auch. S�mtliche �nderungen gelten nur f�r den aktuellen Namensraum (I&lt;scope&gt;)<br />
und die I&lt;defaults&gt; k�nnen jederzeit wiederhergestellt werden, da sie unter<br />
C&lt;%?LANG&gt; gespeichert sind.</p>
<h3 id="zeig_mir_dein_inneres">Zeig mir dein Inneres!</h3>
<p>
Objekte k�nnen in Perl 6 sehr stark durchleuchtet und ver�ndert werden. Jede<br />
Elternklasse, jede Methode und jede Signatur (mit C&lt;$obj.methode.signature&gt;) kann<br />
abgefragt oder verschiedenst gepr�ft werden. C&lt;$obj.WHERE&gt; nennt die Speicheradresse,<br />
C&lt;.WHAT&gt; den Typ, was in etwa dem Befehl C&lt;ref&gt; in Perl 5 entspricht.</p>
<p>
Es lassen sich mit Roles beliebige Methoden zu Laufzeit in ein Objekt einf�gen,<br />
aber der direkteste Weg daf�r ist wohl:</p>
<p>
	augment slang Regex {<br />
		token regex_metachar:&lt;^&gt; { ... }<br />
	}</p>
<p>
C&lt;augment&gt; (englisch f�r einblenden) f�gt nur Regeln (Methoden) in die Grammatik<br />
(Klasse) ein, soll eine gesamte Slangdefinition ausgetauscht werden, dann ist <br />
C&lt;supersede&gt; (englisch f�r �berlagern) das Mittel der Wahl.</p>
<p>
Es gibt noch viele weitere Sondervariablen, wie f�r den umgebenden Block<br />
(C&lt;&amp;?BLOCK&gt;) oder die umgebende Routine (C&lt;&amp;?ROUTINE&gt;) mit denen sich weit mehr<br />
tun l��t als noch in Perl 5, z.B. lassen sich alle Sprungmarken im aktuellen Block<br />
mit C&lt;&amp;?BLOCK.labels&gt; auflisten. Auch C&lt;&amp;?ROUTINE.name&gt; ist praktisch, wenn man<br />
nicht merh wei� wo sich die Ausf�hrung gerade befindet. Doch dies sieht man alles<br />
in den Tabellen im Anhang B meines Wiki-Kompendiums, siehe Artikelende.</p>
<h3 id="was_sich_sonst_noch_tat">Was sich sonst noch tat</h3>
<p>
Zu Beginn dieses Tutorials k�ndigte ich an, mit jedem Teil auch alle �nderungen<br />
bereits erw�hnter Syntax zu dokumentieren. Doch zum Gl�ck waren es weit weniger,<br />
als angenommen, soda� eine kleine Aktualisierung am Ende des letzten Teils gen�gt.<br />
Gleich im ersten Teil wies ich auf eine potentielle Stolperfalle:</p>
<p>
	$b = =$a; # Zuweisung einer Zeile aus einem Datenstrom<br />
	$b == $a; # numerischer Vergleich</p>
<p>
Diese ist mittlerweile behoben, denn der prefixe Operator C&lt;=&gt; wurde ersatzlos<br />
gestrichen. Statt dessen sollte man die Methoden C&lt;.lines&gt; und C&lt;.get&gt; verwenden.<br />
C&lt;.lines&gt; liefert einen Iterator und C&lt;.get&gt; tats�chlich Textzeilen.</p>
<p>
	my $name = &quot;artikel.txt&quot;;<br />
	my $handle = $name.open err die &quot;Kann '$name' nicht �ffnen: $!&quot;;<br />
	my $ganzer_inhalt = $handle.slurp;</p>
<p>
	for $handle.lines <del>&gt; $zeile { ... }<br />
	while $handle.get</del> &gt; $zeile { ... }<br />
	$zeile = $handle.get;<br />
	$handle.close;</p>
<p>
Da der Kopf einer C&lt;while&gt;-Schleife im Skalarkontext und C&lt;eager&gt; evaluiert wird,<br />
w�rde C&lt;.lines&gt; dort einen Array mit allen Zeilen liefern. Da jedoch C&lt;for&gt; den<br />
Arraykontext forciert der standartm��ig C&lt;lazy&gt; ist, wird dort bei jeder Iteration<br />
jeweils eine Zeile �berwiesen. Im Skalarkontext w�rden alle Zeilen mit C&lt;~&gt;<br />
verbunden geliefert.</p>
<p>
Der neue Metaoperator C&lt;R&gt; kam hinzu. Er vertauscht lediglich die Operanden,<br />
R steht f�r I&lt;reverse&gt; (englisch r�ckw�rts).</p>
<p>
	say 3 R- 4; # sagt 1<br />
	say 2 R** 3; # sagt 9</p>
<p>
Der Kreuz-Metaoperator wurde vereinfacht. Von nun an reicht es dem Operator ein<br />
C&lt;X&gt; voranzustellen, vorher hie� das noch z.B. C&lt;X~X&gt;.</p>
<p>
	&lt;a b&gt; X~ &lt;1 2&gt; # &lt;a1 a2 b1 b2&gt;</p>
<p>
Der Hyper-Metaoperator l��t sich aber nicht so vereinfachen, da die Pfeile<br />
(&lt;&lt; und &gt;&gt;) bestimmen, wie der Operator auf Dimensionalit�t der jeweiligen Seite<br />
reagieren soll.</p>
<p>
Neben autogenerierten positionalen Parametern (erkennbar an der twigil C&lt;^&gt;), gibt<br />
es nun autogenerierte benannte Parameter, deren Twigil C&lt;:&gt; sich nahtlos in die<br />
Syntax zur Deklarierung benannter Parameter einf�gt.</p>
<p>
Selbstverst�ndlich gab es noch weit mehr �nderungen, doch diese sind oft subtiler<br />
oder liegen au�erhalb der behandelten Themen. Einen tieferen Einblick gew�hrt das<br />
Tutorial in der Wiki der deutschen Perl-Community unter<br />
L&lt;wiki.perl-community.de/cgi-bin/foswiki/view/Wissensbasis/PerlTafel&gt;,<br />
oder einfacher zu tippen: L&lt;de.perl.org&gt; und dann auf Wiki &gt; Wissensbasis &gt; Tutorials<br />
klicken. Viele hilfreiche Texte beinhaltet auch die Seiten von Moritz Lentz unter<br />
L&lt;perl-6.de&gt;. Dieses Tutorial wurde jetzt in eine Wiki online gestellt unter:<br />
L<a target="_blank" title="(external link)" href="http://wiki.perl-community.de/cgi-bin/foswiki/view/Wissensbasis/Perl6Tutorial">http://wiki.perl-community.de/cgi-bin/foswiki/view/Wissensbasis/Perl6Tutorial</a><br />
und kann nun von jedem kommentiert und verbessert werden. Ich habe vor es weiter<br />
zu verbessern und auch ins Englisch zu �bersetzen, wo es in der Wiki der TPF<br />
unter L[perl tablets] zu finden sein wird.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_7" title="(34 months)  toc Text, Rules and Grammars Willkommen zum siebenten Teil dieses poetischen Perl 6-Tutorials, da v...">Previous Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 7 --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(39 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_8</guid>
<pubDate>Fri, 06 Aug 2010 23:52:22 -0000</pubDate>
</item>

<item>
<title><![CDATA[Perl 6 Tutorial Part 4]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_4</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#still_operators_left">Still operators left?</a><!-- wiki: {link: [] Still operators left?} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#werdet_ein_paar">Werdet ein Paar</a><!-- wiki: {link: [] Werdet ein Paar} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#parameterpaare_und">Parameterpaare und $@%</a><!-- wiki: {link: [] Parameterpaare und $@%} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#datentyp_code">Datentyp Code</a><!-- wiki: {link: [] Datentyp Code} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#closure">Closure</a><!-- wiki: {link: [] Closure} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#einfache_ausf_hrung_mit_r_ckhand">Einfache Ausf�hrung mit R�ckhand</a><!-- wiki: {link: [] Einfache Ausf�hrung mit R�ckhand} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#bedingte_ausf_hrung_ist_einfach">Bedingte Ausf�hrung ist einfach</a><!-- wiki: {link: [] Bedingte Ausf�hrung ist einfach} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#sch_ne_schleifen">Sch�ne Schleifen</a><!-- wiki: {link: [] Sch�ne Schleifen} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#blockparameter">Blockparameter</a><!-- wiki: {link: [] Blockparameter} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><h3 id="still_operators_left">Still operators left?</h3>
<p>
Nach &quot;Operatoren f�r Skalare&quot; und &quot;Operatoren f�r Arrays&quot; ist sicher &quot;Operatoren<br />
f�r Hashes&quot; der n�chste logische Titel. Nur leider gibt es keine speziellen<br />
Operatoren f�r Hashes in Perl 6. Au�er vielleicht den &quot;dicken Pfeil&quot; (&quot;fat arrow&quot;).<br />
�hnlich dem Komma, da� einen Array erzeugt, weist der &quot;=&gt;&quot; den Interpreter an,<br />
einen Hash zu bilden. Deswegen wird er auch manchmal &quot;hash composer&quot; genannt.</p>
<p>
Perl 6:<br />
	$ziffern = (7); # Zuweisung eines Wertes<br />
	$ziffern = 7,; # Referenz auf einen Array<br />
	%ziffern = 1 =&gt; 'adin', 2 =&gt; 'dwa';<br />
	%ziffern = {1 =&gt; 'uno', 2 =&gt; 'due'}; # geht auch</p>
<p>
Da runde Klammern nun nur noch gruppieren und geschweifte Klammern per default<br />
einen anonymen Codeblock darstellen, braucht der Interpreter auch diesen Hinweis<br />
um zu erkennen, da� der Programmierer gerne einen Hash h�tte. Weil geschweifte<br />
Klammern dar�ber hinaus immernoch f�r Hashreferenzen stehen k�nnen, wird in der<br />
letzten Beispielzeile eine solche erzeugt. Nur wird diese, anders als in Perl 5,<br />
automatisch dereferenziert, wenn sie einem Hash zugewiesen wird. Dieses Prinzip<br />
wurde in der letzten Folge schon anhand von Arrays demonstriert. In Perl 5 war der<br />
&quot;fat arrow&quot; nur eine lustige Schreibweise f�r ein Komma. Es half dem Programmierer<br />
zu erkennen da� hier ein Hash ensteht, aber er h�tte genauso gut schreiben k�nnen:</p>
<p>
Perl 6:<br />
	%ziffern = (0, 'null', 1, 'eins');<br />
	%ziffern = {1, 'jeden', 2, 'dva'};</p>
<p>
Dies funktioniert auch weiterhin wunderbar. Aber nicht weil nun Hashes immer noch<br />
Arrays mit gerader L�nge sind, sondern weil es eine Regel gibt, wie der Array in<br />
einen Hash(kontext) umgewandelt wird. Und ja, in der zweiten Zeile liefert ein<br />
anonymer Block einen Array zur�ck. In diesem Beispiel st�rt das nicht.Aber es kann <br />
zu sehr unerwarteten Ergebnissen f�hren, da syntaktisch gleiche Bl�cke in <br />
Sonderf�llen andere R�ckgabewerte haben k�nnten. Um es eindeutig zu halten, <br />
k�nnen die Operatoren C&lt;%&gt; und C&lt;hash&gt; den Hashkontext erzwingen und anzeigen.</p>
<p>
Perl 6:<br />
	$hashref = hash{ 0, 'null', 1, 'eins' };<br />
	$hashref = %( 0, 'null', 1, 'eins' );<br />
	# oder klassisch:<br />
	$hashref = { '1' =&gt; 'a', '2' =&gt; 'b', 3 =&gt; 'c' };<br />
	# entspricht \('1' =&gt; 'a', '2' =&gt; 'b', 3 =&gt; 'c');<br />
	# oder auch %( 1..3 Z 'a'..'c' );</p>
<p>
Ein Hash kann aber auch in einen anderen Kontext �berf�hrt werden. Im boolschen<br />
Kontext meldet er, ob er �berhaupt Schl�ssel besitzt, im numerischen Kontext<br />
die Anzahl der Schl�ssel und im Stringkontext gibt er seinen gesamten Inhalt als<br />
String aus.</p>
<p>
Perl 6:<br />
	my %buch = ( 1..3 Z 'a'..'c');<br />
	? %buch # Bool::True<br />
	+ %buch # 3, entspricht %buch.elems<br />
	~ %buch # &quot;1\ta\n2\tb\n3\tc\n&quot;</p>
<p>
Weit praktischer ist aber meistens die Ausgabe der folgenden, selbsterkl�renden<br />
Hashmethoden, welche einen Array zur�ckgeben.</p>
<p>
Perl 6:<br />
	%buch.keys; # (1, 2, 3), entspricht keys %buch<br />
	%buch.values; # ('a', 'b', 'c'), auch values %buch<br />
	%buch.kv; # (1, 'a', 2, 'b', 3, 'c')</p>
<p>
C&lt;keys&gt; und C&lt;values&gt; sind altbekannte Perl 5-Befehle, die es selbstverst�ndlich<br />
auch weiterhin gibt. Aus ihren Initialien leitet sich der Name der Methode C&lt;.kv&gt;<br />
ab, die abwechselnd zugeh�rige Schl�ssel und Werte in einem Array aufz�hlt. Etwas<br />
anders funktioniert dagegen die Methode C&lt;.pairs&gt;. Sie liefert key und value in<br />
einem Skalar, also einen Array von Wertepaaren. Das Gleiche erh�lt man auch, wenn<br />
ein Hash einem Array zugewiesen wird.</p>
<p>
Perl 6:<br />
	%buch.pairs; # (1 =&gt; 'a'), (2 =&gt; 'b'), (3 =&gt; 'c')<br />
	@buch = %buch; # dito</p>
<h3 id="werdet_ein_paar">Werdet ein Paar</h3>
<p>
Key und value in einem Skalar? Das mag zuerst nach einem Array oder vielleicht<br />
einer Junction klingen, ist aber einfach ein Wertepaar. Das Paar geh�rt zu den<br />
v�llig neuen Datentypen, die Perl 6 einf�hrt. Eigentlich sind es auch Paare, die<br />
mit dem &quot;fat arrow&quot; erzeugt werden. In den Synopsen wird &quot;=&gt;&quot; desweg oft auch<br />
&quot;pair constructor&quot; genannt.</p>
<p>
Perl 6:<br />
	my $pair = 'Jakub' =&gt; 'Helena';<br />
	$pair.isa(Pair) # ergibt Bool::True<br />
	$pair.key # 'Jakub'<br />
	$pair.value # 'Helena'</p>
<p>
Paare k�nnen aber auch noch anders generiert werden.</p>
<p>
Perl 6:<br />
	my $pair = :Jakub('Helena'); # oder k�rzer:<br />
	my $pair = :Jakub&lt;Helena&gt;; # &lt;&gt; ist das neue qw()</p>
<p>
Selbstverst�ndlich funktioniert auch diese Schreibweise f�r Hashes.</p>
<p>
Perl 6:<br />
	%regent = :Atreides&lt;Paul&gt;, :Harkonnen&lt;Wladimir&gt;, :Ordo&lt;Executrix&gt;;<br />
	$hashref = {pair &lt;Atreides Paul Harkonnen Wladimir Ordo Executrix&gt; };</p>
<p>
Allerdings dient das nicht der optischen Vielfalt, sondern zeigt, da� Paare mehr<br />
Aufgaben haben, als Hashbausteine zu sein (obwohl sie dazu sehr geeignet sind).<br />
Ungeordnete Listen von Wertepaaren mit eindeutigen Schl�sseln entsprechen sicher<br />
eher der Idee eines Hashes als Listen mit gerader L�nge. Das n�chste Beispiel<br />
ist ein bewu�t herbeigef�hrter Unfall, der die Schw�che von Perl 5 demonstriert.<br />
Einzelne Werte die dem Hash entnommen wurden k�nnen jede Zugeh�rigkeit zwischen<br />
den Schl�sseln und Werten zerst�ren.</p>
<p>
Perl 5:<br />
	my %h = (1=&gt;2, 3=&gt;4);<br />
	%h = grep {$_ % 2} %h;<br />
	say %h; # {1 =&gt; 3 }</p>
<p>
Zum Gl�ck wurde f�r Perl 6 auch diese Schmuddelecke aufger�umt.</p>
<p>
Perl 6:<br />
	%h = grep {$_.value % 2} %h.pairs;</p>
<p>
Diese Fassung macht nicht nur mehr Sinn, sondern ist auch noch lesbarer, da hier<br />
explizit steht, was geschieht. Sie kann auch keine unsinnigen Ergebnisse liefern,<br />
da korrekterweise immer Paare durchgereicht werden. Doch um zu beweisen da� die<br />
neue Ordnung nicht einschr�nkt, hier das Perl 5-Beispiel im Perl 6-Syntax.</p>
<p>
Perl 6:<br />
	%h = grep {$_ % 2} %h.kv;</p>
<h3 id="parameterpaare_und">Parameterpaare und $@%</h3>
<p>
Mit Paaren lassen sich wundersame Datenstrukturen wie Hybride aus Hash und Array<br />
erzeugen oder Paarlisten, in denen Schl�ssel mehrfach vorkommen k�nnen. Aber die<br />
wichtigste Verwendung von Paaren au�erhalb der Hashes sind benannte Parameter.<br />
Diese wurden in Perl 5 oft mithilfe von Hashes simuliert. Jedoch bietet Perl 6<br />
daf�r einen expliziten Mechanismus der viele interessante Techniken erm�glicht.<br />
Subroutinen und Parameter�bergaben sind aber das Thema der n�chsten Folge. Doch<br />
selbst &quot;Kernfunktionen&quot; der Sprache haben benannte Parameter, welche die zweite<br />
Syntax der Paare benutzen. Die in Folge 2 vorgestellten Dateitestoperatoren<br />
C&lt;:r :w :e&gt; sind nichts weiter als Attribute des Objektes vom Typ Filehandle.<br />
Dabei dr�ckt die Formulierung C&lt;:r&gt; aus: &quot;Ich h�tte gerne den Wert, der unter dem<br />
Schl�ssel &quot;r&quot; gespeichert ist&quot;. �hnliches gilt auch beim �ffnen einer Datei.</p>
<p>
Perl 6:<br />
	my $fh = open &quot;datei.txt&quot;, :r;</p>
<p>
Die Datei wird im Lesemodus ge�ffnet, indem der benannte Parameter &quot;r&quot; gesetzt<br />
wird. In dem Beispiel f�llt auch auf, da� Filehandle kein eigener Variablentyp<br />
sind und auch keinen eigenen Namensraum mehr besitzen. Auch Verzeichnishandler<br />
und Formate werden nun in Skalaren gespeichert. Die Formate weichen dazu aus dem<br />
Sprachkern in ein Modul. Auch Token wie C&lt;__LINE__&gt; oder C&lt;__PACKAGE__&gt;, die man<br />
als Systemvariablen mit eigenem, sonderbaren Namensraum ansehen k�nnte, sind in<br />
ihrer neuen Schreibweise C&lt;$?LINE&gt; und C&lt;$?PACKAGE&gt; eher als Variablen erkennbar.<br />
Ihr seltsamer Namensraum nennt sich nun &quot;compiler hint variables&quot;. Er umfasst<br />
Informationen, die ab dem Zeitpunkt der Kompilierung feststehen und auch nicht<br />
ge�ndert werden d�rfen. Eine Zuweisung wie C&lt;$?FILE = 'was anderes';&gt; w�rde einen<br />
Compile-Error ausgeben. Dieser Sonderstatus wird mit der sekund�ren Sigil (Twigil)<br />
&quot;?&quot; markiert. Achtung: In Perl 6 bezeichnet Token eine sehr einfache Form einer<br />
Regex.</p>
<p>
Die Streichung der 4 Sondernamensr�ume f�r Variablen (Handler, Formate und Token)<br />
sind weitere Beispiele des Grundsatzes: &quot;keine Ausnahmen&quot; und der Forderung nach<br />
einem deklarativen Syntax, der den Inhalt eines Ausdrucks deutlicher sichtbar macht.<br />
Die verbliebenen Namensr�ume k�nnen eindeutig an der Sigil unterschieden werden.<br />
Oder einfacher: $wunder, @wunder und %wunder sind drei verschiedene Variablen.</p>
<h3 id="datentyp_code">Datentyp Code</h3>
<p>
Der vierte Namensraum ohne Sigil, ist der der Subroutinen. Und wie bei Hashes und<br />
Arrays, k�nnen Referenzen auf Routinen ebenfalls in Skalaren gespeichert werden.</p>
<p>
Perl 6:<br />
	my $coderef = sub { say &quot;Moin #perl&quot; }</p>
<p>
Die besitzen dann den Datentyp &quot;Code&quot;. (Das fehlende Semikolon ist kein Fehler.<br />
Perl 6 verlangt nur dann ein solches, wenn mehrere derartiger Deklarationen ohne<br />
den Befehl C&lt;sub&gt; in eine Zeile schreibt. Als Eselsbr�cke: ein &quot;}&quot; am Zeilenende<br />
impliziert ein Semikolon.) Das C&lt;sub&gt; k�nnte man also auch weglassen, was nichts<br />
am Datentyp und an der Benutzung der Variable �ndert.</p>
<p>
Perl 6:<br />
	my $coderef = { say &quot;Moin #perl&quot; }<br />
	# dito, ebenfalls noch m�glich<br />
	my $cr = \{ say &quot;Moin #perl&quot; }<br />
	$cr.isa(Code) # ergibt Bool::True<br />
	$coderef(); # f�hrt den Block aus</p>
<p>
Trotzdem sind die Unterschiede zwischen einer &quot;sub&quot; und einem Block so zahlreich,<br />
da� man damit viele Seiten f�llen kann, sie alle aufzuz�hlen. Deshalb wird diese<br />
Folge auch eher Bl�cke behandeln und erst die n�chste die Sonderform &quot;Subroutine&quot;.<br />
Einfache Bl�cke besitzen n�mlich nur Grundf�higkeiten und Befehle wie C&lt;while&gt;,<br />
C&lt;if&gt;, C&lt;package&gt; und C&lt;sub&gt; f�gen dem weitere Funktionalit�t hinzu, weswegen sie<br />
im Perl 6-Jargon Blockmodifikatoren genannt werden. Da diese Modifikatoren &quot;builtins&quot;<br />
und keine Routinen sind, kann man sich jetzt nicht nur die runden Klammern sparen.<br />
Es wird empfohlen auf sie zu verzichten. Und wenn nicht anders m�glich, sollte man<br />
zumindest darauf achten, zwischen Modifikator und den runden Klammern Leerzeichen<br />
zu lassen, es sei eine C&lt;sub&gt; namens C&lt;if&gt; m�chte angesprochen sein.</p>
<p>
Perl 6:<br />
	if $a &gt; 6 { say &quot;Zu alt f�r den Kindergarten&quot; }<br />
	if($a &gt; 6) { ... } # Error</p>
<p>
Doch beginnen wir mit einem nackten Block.</p>
<h3 id="closure">Closure</h3>
<p>
Bl�cke sind in Perl 6 alles, was von geschweiften Klammern umschlossen ist, soweit<br />
nicht darin ein C&lt;=&gt;&gt; oder C&lt;pair&gt; steht, oder die voranstehenden Operatoren C&lt;%&gt;<br />
oder C&lt;hash&gt; eine Hashreferenz erzwingen. Sie teilen Code in logische Einheiten.<br />
Dadurch werden die Quellen �bersichtlicher und verst�ndlicher. Es erlaubt aber<br />
auch Variablen einem Block zuzuordnen. Das hat den gro�en Vorteil, da� man damit<br />
heimt�ckische �berschneidungen mit gleichnamigen Variablen anderer Programmteile<br />
ausschlie�en kann. Au�erdem spart es Arbeitsspeicher, wenn die Lebensdauer einer<br />
Variable auf den Block begrenzt wird, in dem ihr Inhalt gebraucht wird.</p>
<p>
Der erste Versuch in die Richtung war der Befehl C&lt;local&gt;, der bereits vor Perl 5<br />
eingef�hrt wurde. Doch der �berlagert eine eventuell exisierende, gleichnamige<br />
Variable tempor�r, bis die Ausf�hrung des aktuellen Blocks beendet ist. Deswegen<br />
wurde die Anweisung in C&lt;temp&gt; umbenannt. Eine echte Bindung zwischen Variable und<br />
Block erzeugt C&lt;my&gt;, welches Perl 5 brachte. Seit dem wird eindringlich empfohlen<br />
C&lt;my&gt; anstatt C&lt;local&gt; zu verwenden. Wenn n�mlich aus einem Block (in dem eine<br />
C&lt;local&gt;-Variable definiert wurde) eine Routine aufgerufen wird, �berschreibt die<br />
&quot;lokale&quot; Variable dort gleichnamige Br�der. Da das selten den Erwartungen entspricht,<br />
sollte man es mit C&lt;my&gt; oder C&lt;state&gt; verhindern. Eine so erzeugte, lexikalisch <br />
lokale Variable w�re innerhalb der Subroutine unbekannt und wird nur eingeblendet,<br />
w�hrend ein Befehl des betreffenden Blocks ausgef�hrt wird. Einziger Unterschied<br />
zwischen beiden Befehlen: C&lt;my&gt; initialisiert die Variable nach jedem Neustart des<br />
Blocks von neuem mit dem Anfangswert, wohingegen C&lt;state&gt; da� nur beim ersten Mal<br />
tut und sich danach den Inhalt bis zum n�chsten Blockaufruf merkt. Dieses Verhalten<br />
von C&lt;state&gt;-Variablen nennt man in der Informatik &quot;Closure&quot; und ist seit Jahren <br />
Bestandteil funktionaler Programmierung. Es lie� sich auch mit einem zus�tzlichen,<br />
umschlie�enden Block und C&lt;my&gt; simulieren, was aber umst�ndlich und fehleranf�llig<br />
war. F�r einfache Closures wurde deshalb der C&lt;state&gt;-Befehl von Perl 6 nach 5.10<br />
zur�ckportiert.</p>
<h3 id="einfache_ausf_hrung_mit_r_ckhand">Einfache Ausf�hrung mit R�ckhand</h3>
<p>
In Bl�cken stehen meist mehrere Befehle, von denen der zuletzt ausgef�hrte den <br />
R�ckgabewert des Blocks angibt. Um ihn ihn einer Variable zuzuweisen, mu� der<br />
Befehl C&lt;do&gt; verwendet werden, auch wenn nackte Bl�cke immer ausgef�hrt werden,<br />
solang sie keine Parameter an eine Routine sind. (wie bei map, sort etc.)</p>
<p>
Perl 6:<br />
	my $zahl = do { rette_regenwald(); gl�ckszahl() }<br />
	# oder l�nger :<br />
	my $coderef = { rette_regenwald(); gl�ckszahl() }<br />
	my $zahl = $coderef();</p>
<p>
Auch auf einzelne Befehle, die nicht von geschweiften Klammern umgeben sind, kann<br />
C&lt;do&gt; angewendet werden, um sie als Ausdruck zu evaluieren. Daher ist auch diese<br />
umst�ndliche Umschreibung des tern�ren Operators m�glich.</p>
<p>
Perl 6:<br />
	$x = do if $a { $b } else { $c };<br />
	$x = $a ?? $b :: $c; # k�rzer</p>
<p>
Da C&lt;do&gt; einen Block immer genau einmal ausf�hren l��t, werden solche Abschnitte<br />
jetzt auch &quot;do once loop&quot; genannt. Um mit dieser einfachen Regel nicht zu brechen,<br />
wurden Schleifenkonstrukte wie C&lt;do { ... } while ()&gt; in C&lt;repeat { ... } while ()&gt;<br />
umbenannt. Auch alle weiteren Verwendungsm�glichkeiten von C&lt;do&gt; die Perl 5 kennt,<br />
wurden gestrichen. Daf�r f�hrte Larry mit C&lt;gather&gt; eine Variante von C&lt;do&gt; ein,<br />
die einem Block erlaubt eine Liste zur�ckzugeben. Die einzelnen Werte werden mit<br />
dem Befehl C&lt;take&gt; einzeln oder in Gruppen ausgew�hlt.</p>
<p>
Perl 6:<br />
	# enth�lt: 'Gauguin', 'Cezanne'<br />
	my @maler = gather {<br />
		my $r = take 'Gauguin';<br />
		# $r enth�lt 'Gauguin'<br />
		take 'Cezanne' if $r;<br />
	}<br />
	# enth�lt: 1,10,2,20<br />
	my @x = gather for 1..2 {<br />
		take $, $ * 10;<br />
	}</p>
<p>
In Kombination mit Schleifen und bedingten Anweisungen entfaltet C&lt;gather/take&gt;<br />
erst seine volle M�chtigkeit. Die Beispiele zeigen auch wie Blockmodifikatoren<br />
ohne weitere Klammern kombiniert werden k�nnen, was eine Konsequenz der bereits<br />
vorgestellten Regeln ist. Auch bei nachgestellten Konstrukten kann damit manche<br />
Zeilen vereinfacht werden.</p>
<p>
Perl 5:<br />
	{ print if $_ % 2 } for 0..10;</p>
<p>
Perl 6:<br />
	.print if $_ % 2 for ^11;</p>
<p>
Soll in Perl 6 ein Befehl (als Methode) auf $_ angewendet werden, sollte er mit<br />
einem Punkt beginnen. Die genauen Hintergr�nde dieser Designentscheidung wurden<br />
in der ersten Folge erl�utert. Doch zur�ck zu den R�ckgabewerten. So wie C&lt;take&gt;<br />
sie f�r den umgebenden C&lt;gather&gt;-Block bestimmt, gibt es auch einen Befehl f�r<br />
den skalaren R�ckgabewert, der gleichzeitig die Ausf�hrung des Blocks abbricht.<br />
Dieser Befehl hei�t zur allgemeinen �berraschung nicht C&lt;return&gt;. C&lt;return&gt; ist<br />
Subroutinen und artverwandten Funktionseinheiten vorbehalten, aus Gr�nden, die<br />
in der n�chsten Folge genau beschrieben werden. Das schlichte Verlassen des<br />
umschlie�enden Blocks wird von einem C&lt;leave&gt; ausgef�hrt. Soll ein bestimmter<br />
Block beendet werden, so mu� dessen Anfang durch ein &quot;Label&quot; (LABELNAME:)<br />
markiert sein, um mit C&lt;LABELNAME.leave&gt; aus ihm hinauszutreten. Daraus folgt<br />
ebenfalls, da� Perl 6 die mittelalterlichen Freuden extensiver C&lt;goto&gt;-Benutzung<br />
keineswegs einschr�nkt. Selbst ein fortraneskes &quot;computed goto&quot; kann unver�ndert<br />
(wie in Perl 5) geschrieben werden.</p>
<p>
Der mit C&lt;leave&gt; definierte R�ckgabewert kann aber noch mehr, als in eine Variable<br />
zugwiesen zu werden. Er kann auch die Ausf�hrung von Bl�cken steuern, die mit<br />
Auswahloperatoren verkn�pft sind.</p>
<p>
Perl 6:<br />
	tu_was() &amp;&amp; das_auch();<br />
	# ist andere Schreibweise f�r:<br />
	{ tuwas() } &amp;&amp; { das_auch() };<br />
	# ist andere Schreibweise f�r:<br />
	{ tuwas() } and { das_auch() };</p>
<p>
Doch C&lt;&amp;&amp;&gt;, C&lt;||&gt; und C&lt;^^&gt; wurden schon in Folge 2 behandelt und f�r die Ops<br />
macht es keinen Unterschied ob sie die Ergebnisse von einzelnen Befehlen oder<br />
ganzen Bl�cken verkn�pfen. Wirklich neu und speziell nur f�r Bl�cke sind hingegegen<br />
C&lt;andthen&gt; und C&lt;orelse&gt;. Grundlegend entsprechen sie den Befehlen C&lt;and&gt; und C&lt;or&gt;.<br />
Beendet der linke Block erfolgreich, l��t C&lt;andthen&gt; ebenfalls den rechten<br />
ausf�hren. Allerdings, um die Kontextvariable C&lt;$_&gt; weiterhin benutzen zu k�nnen.<br />
Sie wird in diesem Sonderfall sozusagen &quot;Closure&quot; zweier Bl�cke. C&lt;orelse&gt; eignet<br />
sich vor allem zur Fehlerbehandlung. Ist der linke R�ckgabewert nicht positiv,<br />
startet C&lt;orelse&gt; den rechten Block, in dem die Fehlermeldung (Sondervariable $!)<br />
weiterhin bekannt ist.</p>
<h3 id="bedingte_ausf_hrung_ist_einfach">Bedingte Ausf�hrung ist einfach</h3>
<p>
In der Regel werden jedoch bedingte Anweisungen mit den vertrauten Schl��elw�rtern<br />
C&lt;if&gt;, C&lt;elsif&gt;, C&lt;else&gt; und C&lt;unless&gt; formuliert. Letzeres ist zwar eine Eigenheit<br />
von Perl, die nicht mehr mit C&lt;elsif&gt; und C&lt;else&gt; kombiniert werden darf, aber die<br />
Funktionsweise dieser 4 Befehle sollte keiner weiteren Erkl�rung bed�rfen.<br />
Auch C&lt;given&gt;, C&lt;when&gt; und C&lt;default&gt; wurden mit ihrer Einf�rung zur Version<br />
5.10 gen�gend vorgestellt. Vergessen wurde dabei manchmal lediglich, da� C&lt;given&gt; und<br />
C&lt;when&gt; sich auch in anderen Zusammenh�ngen benutzen lassen. C&lt;given&gt; eignet sich<br />
hervorragend umst�ndliche Ausdr�cke zu vereinfachen wie folgende:</p>
<p>
Perl 6:<br />
	$tiefer.objekt.namensraum.var1 = <br />
		$tiefer.objekt.namensraum.var2 +<br />
		$tiefer.objekt.namensraum.var3;<br />
	# oder :<br />
	given $tiefer.objekt.namensraum <br />
	{ $.var1 = $.var2 + $_.var3 }</p>
<p>
Da C&lt;given&gt; ebenso wie C&lt;for&gt; (es gibt kein C&lt;foreach&gt; mehr) die Kontextvariable<br />
setzt, k�nnen C&lt;when&gt;-Klauseln auch in C&lt;for&gt;-Schleifen verwendet werden.</p>
<p>
Perl 6:<br />
	for @beine {<br />
		print &quot;Ist $_ &quot;<br />
		when 1 { say &quot;�berhaupt ein Tier?&quot; }<br />
		when 6|8|10 { say &quot;ein Insekt?&quot; }<br />
		when &gt; 20 { say &quot;eine Raupe?&quot; }<br />
		default { say &quot;ein Zweibein&quot;}<br />
	}</p>
<p>
C&lt;default&gt; ist nur ein Alias auf C&lt;when *&gt; (oder $_ ~~ Whatever) und im Gegensatz<br />
zu einem &quot;C-switch&quot; entfüllt auch das notorische C&lt;break&gt;, da ein implizites <br />
C&lt;break&gt; jede C&lt;when&gt;-Klausel beendet. Wer mag kann aber auch jederzeit mit C&lt;break&gt;<br />
die Klausel und den umgebenden &quot;contextualizer&quot;-Block manuell verlassen. Wenn nur<br />
zur n�chsten Klausel gesprungen werden soll, dann ist C&lt;continue&gt; das Mittel der Wahl.<br />
Noch weitere besondere Sprungbefehle gibt es f�r Schleifen.</p>
<h3 id="sch_ne_schleifen">Sch�ne Schleifen</h3>
<p>
Auch hier wurden die alten Standarts kaum anger�hrt. C&lt;while&gt; und C&lt;until&gt; blieben<br />
unver�ndert, lediglich ein C&lt;repeat { ... } while $a &lt; 3;&gt; ist gew�hnungsbed�rftig.<br />
Ansonst wird der Ausdruck nach C&lt;while&gt; und C&lt;until&gt; (ebenso wie bei C&lt;if&gt; und C&lt;unless&gt;)<br />
in den boolschen Skalarkontext evaluiert. Selbstverst�ndlich wird dann bei einem<br />
Ergebnis von Bool::True (beziehungsweise Boole::False) der Block ausgef�hrt. &lt;for&gt;<br />
ist jetzt ein reiner Array-Iterator und evaluiert entsprechend in den &quot;lazy list&quot;-Kontext.<br />
Genau deshalb wird die zeilenweise Abarbeitung einer Datei jetzt so geschrieben:</p>
<p>
Perl 6:<br />
	my $fh = open &quot;aufsatz.txt&quot;;<br />
	for =$fh {<br />
		...</p>
<p>
W�rde jemand C&lt;while&gt; anstatt C&lt;for&gt; nehmen, so lieferte C&lt;=$fh&gt; im Skalarkontext den<br />
gesamten Dateiinhalt auf einmal ab. Bis dahin ist alles logisch, doch was geschah mit<br />
der klassischen &quot;C-Stil&quot;-for-Schleife. Ihr Ausdruck wird eindeutig in den void-Kontext<br />
evaluiert und deshalb bekam sie ein eigenes Schlüsslwort. Inhaltlich unterschiedliches<br />
soll auch optisch unterscheidbar sein. Deswegen heißt die Allzweckschleife nun &quot;Schleife&quot;<br />
(C&lt;loop&gt;). Da der leere Kontext immer das Selbe Ergebnis liefert, ist auch C&lt;loop {...}&gt;<br />
(ein Synonym für C&lt;loop (;;) {...}&gt;) eine nettere Schreibweise für C&lt;while 1 {...}&gt;, daß<br />
weiterhin möglich ist. Eine weitere gute Nachricht: die Sprungbefehle C&lt;last&gt; (verlasse<br />
die Schleife), C&lt;redo&gt; (wiederhole den Durchgang) und C&lt;next&gt; (zur nächsten Iteration)<br />
funktionieren jetzt einwandfrei. Bei C&lt;do {...} while ();&gt; hat hier Perl 5 immer noch <br />
Probleme, denn das sind nachträglich eingeführte Konstrukte und keine echten Schleifen.<br />
Wie C&lt;leave&gt; können auch diese Sprungbefehle mit Labelmarken wie z.B. C&lt;LABEL.next;&gt;<br />
oder C&lt;next LABEL;&gt; kombiniert werden.</p>
<h3 id="blockparameter">Blockparameter</h3>
<p>
Im letzten Beispiel fehlte noch ein entscheidendes Detail. F�r C&lt;for&gt;-Schleifen wird<br />
oft eine lokale Laufvariable definiert:</p>
<p>
Perl 5:<br />
	for my $i (1..10) { ...</p>
<p>
Weil hier das C&lt;my&gt; nicht innerhalb des Blockes steht, f�r da� es seine G�ltigkeit<br />
besitzt, w�rde das gegen die klaren Regeln in Perl 6 versto�en. Deshalb gibt es daf�r<br />
nun einen besonderen Syntax der es gleichzeitig zul��t mehrere Parameter an einen<br />
Block zu �bergeben. Da der Syntax symbolisieren soll, da� hier schnell ein paar Werte<br />
in den Block &quot;hineingeworfen&quot; werden, nennt sich diese Formulierung &quot;pointy block&quot;.<br />
Sie erlaubt elegante L�sungen, f�r die bisher wesentlich kompliziertere Formulierungen<br />
notwendig waren.</p>
<p>
Perl 6:<br />
	for 1..10 <del>&gt; $i { ...<br />
	for %h.kv</del> &gt; $k, $v { ...<br />
	for @a Z @b Z @c <del>&gt; $a, $b, $c { ...<br />
	while berechne()</del> &gt; $wert { ...</p>
<p>
Auch wenn C&lt;while&gt; in den boolschen Kontext evaluiert, bekommt C&lt;$wert&gt; den Betrag<br />
den C&lt;berechne()&gt; liefert. Wie beschrieben sind diese Variablen Parameter und nicht<br />
lexikalisch lokal und k�nnen daher auch nicht innerhalb des Blocks ver�ndert werden.<br />
Braucht man jedoch unbedingt ver�nderbare Laufvariablen, so mu� dies mit einem leicht<br />
ge�nderten Syntax gekennzeichnet sein.</p>
<p>
Perl 6:<br />
	for 1..10 &lt;-&gt; $i { ...</p>
<p>
Wenn kein Variablennamen angegeben w�re, landen die Inhalte nat�rlich in $_ oder @.<br />
Nun ist @<a href="http://www.perlfoundation.org/perl6/index.cgi?2" title="[click to create page]" class="incipient">2</a> nicht immer der sch�nste Variablennamen und verwirrt manch einen Neuling.<br />
F�r solche F�lle erfand Larry die automatisch benannten Parameter die auch einen<br />
weiteren Sonderfall in Perl 5 mit einer allgemeinen Regel abschaffen. Damit ist der<br />
C&lt;sort&gt;-Befehl gemeint, in dessen Block die einmaligen Sondervariablen $a und $b<br />
bekannt sind, welche jetzt C&lt;$^a&gt; und C&lt;$^b&gt; geschrieben werden. Die Twigil (sekund�re<br />
Sigil) &quot;^&quot; kennzeichnet die Platzhalter-Variablen. Diese d�rfen benutzt werden,<br />
ohne ihre Namen zu deklarieren. Man mu� nur darauf achten, da� alphabetisch sortiert,<br />
ihre Namen der Reihenfolge der Parameter entsprechen, in der sie dem Block �bergeben<br />
wurden.</p>
<p>
Perl 6:<br />
	for 1..10 { say $^i ...<br />
	for 1..10 { say $^cc ...<br />
	$coderef1 = { say $^a, $^b };<br />
	$coderef2 = { say $^z, $^zz };<br />
	$coderef1('a','d'); # sagt ade<br />
	$coderef2('a','d'); # dito</p>
<p>
Mehr dazu in Teil 5, wenn in Subroutinen die hohe Schule der Parameter�bergabe<br />
zelebriert wird.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_3" title="(34 months)  toc Arrays in Perl Und wie angekündigt geht es in dieser Folge um Operatoren, die den Umgang mit Ar...">Previous Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 3 --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(39 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_5" title="(34 months)  toc Captures und Subroutinen Willkommen zum fünften Teil dieses ausführlichen Perl 6-Tutorials, der...">Next Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 5 --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_4</guid>
<pubDate>Fri, 06 Aug 2010 23:50:09 -0000</pubDate>
</item>

<item>
<title><![CDATA[Perl 6 Tutorial Part 3]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_3</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#arrays_in_perl">Arrays in Perl</a><!-- wiki: {link: [] Arrays in Perl} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#f_C3_BCttern_der_arrays">Füttern der Arrays</a><!-- wiki: {link: [] Füttern der Arrays} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#es_lebe_die_faulheit">Es lebe die Faulheit</a><!-- wiki: {link: [] Es lebe die Faulheit} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#die_raubtierf_C3_BCtterung_geht_weiter">Die Raubtierfütterung geht weiter</a><!-- wiki: {link: [] Die Raubtierfütterung geht weiter} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#giga_hyper_meta">Giga, Hyper, Meta ...</a><!-- wiki: {link: [] Giga, Hyper, Meta ...} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#und_noch_ein_blick_in_die_quantenwelt">Und noch ein Blick in die Quantenwelt</a><!-- wiki: {link: [] Und noch ein Blick in die Quantenwelt} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#danke">Danke</a><!-- wiki: {link: [] Danke} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><h3 id="arrays_in_perl">Arrays in Perl</h3>
<p>
Und wie angekündigt geht es in dieser Folge um Operatoren, die den Umgang mit<br />
Arrays erleichtern. Hier hat Perl 6 sehr zugelegt. Zwar zeichnet sich Perl 5<br />
durch sehr einfach und vielseitig verwendbare Arrays aus, die zudem mit 'map',<br />
'grep' und 'for' sehr flexibel bearbeitet werden können (das gibt es natürlich<br />
auch alles weiterhin), aber besonders funktionale Sprachen wie Haskell haben in<br />
den letzten Jahren gezeigt, daß auf dem Gebiet weit mehr möglich ist. Und es war<br />
auch die durch Pugs herbeigeführte, enge Zusammenarbeit von Haskell-Programmierern<br />
und dem Design-Team, die auf diesem Gebiet deutliche Spuren im Perl 6-Syntax<br />
hinterlassen hat. Darüber hinaus hat sich ebenso grundlegendes in der Schreibweise<br />
der Arrays geändert, daß damit nichts zu tun hat.</p>
<p>
Als Perl noch klein war und auf Larrys Wickeltisch lag, gab es nur einzelne Werte<br />
und einfache Listen oder Hashes als Spielzeug. Um sie gut unterscheiden zu können,<br />
bekamen sie als Erkennungssymbol die Sigil $, @ und %. Da aber Arrays und Hashes<br />
auch einzelne Werte abliefert können und Hashes sogar Arrays von Werten, entschied<br />
Larry, es sei besser in diesen Fällen die Sigil zu ändern, um immer zu sehen, ob<br />
man es grad mit einen oder mehrere Werten zu tun hat. (Hashes sind ja in Perl 5<br />
bloß Arrays mit gerader Länge.) Mit 7 Jahren erhielt Perl jedoch zur Einschulung<br />
Referenzen. Das war gut, denn nun konnte es komplexe Datenstrukturen erzeugen,<br />
was für größere Schulaufgaben wichtig ist. Aber damit verloren die veränderlichen<br />
Sigils ihren ursprünglichen Sinn, denn &quot;$fibo[7]&quot; konnte nun auch (eine Referenz<br />
auf) einen Array oder einen Hash zurückgeben. Und auch das Dereferenzieren mit<br />
geschweiften Klammern wie bei &quot;@a = @{$fibo[7]}&quot; kann zu komplexen Ausdrücken<br />
führen, die Anfänger verwirren. Deshalb haben Variablen in Perl 6 unveränderliche<br />
Sigils. Zu deutsch: eine Arrayvariable beginnt immer mit einem '@'. Damit bleibt <br />
wenigstens der Typ der Variable sichtbar. Zusätzlich vereinfacht das Dinge wie:</p>
<p>
	Perl 5: Perl 6:<br />
	@gerade = @{$zahlen[4]}; @gerade = @zahlen[4];<br />
	$zahl = $halde-&gt;<a href="http://www.perlfoundation.org/perl6/index.cgi?3" title="[click to create page]" class="incipient">3</a><a href="http://www.perlfoundation.org/perl6/index.cgi?4" title="[click to create page]" class="incipient">4</a><a href="http://www.perlfoundation.org/perl6/index.cgi?5" title="[click to create page]" class="incipient">5</a>; $zahl = $halde[3;4;5];</p>
<p>
Diese Beispiele zeigen: den Kontext bestimmt jetzt vor allem der Empfänger der<br />
Daten. Erhält ein Array eine Arrayref, dereferenziert Perl 6 automatisch. Weist<br />
man einem Array einen Skalar zu, hat er nur noch einen (neuen) Wert. Wird einem<br />
Skalar ein Array zugewiesen, so wird er zur Arrayref (ich mein natürlich Capture),<br />
die behandelt werden kann wie ein Array, auch wenn sie die Sigil $ hat. (Fast wie<br />
ein Array in PHP.)</p>
<p>
In Teil 2 wurde vorgestellt, daß ebenso Operatoren den Kontext bestimmen können.<br />
Auch hier erzwingt &quot;~&quot; den Stringkontext, was der Aneinanderreihung der Inhalte<br />
aller Elemente entspricht (selbstverständlich durch Leerzeichen getrennt). Und das<br />
&quot;+&quot; fordert den numerischen Kontext, in dem ein Array die Anzahl seiner Elemente<br />
liefert, in gleicher Weise wie Perl 5-Arrays im skalaren Kontext. Dafür gibt es<br />
noch einen objektorientierten, expliziteren Syntax:</p>
<p>
	Perl 5: Perl 6:<br />
	scalar @gerade; +@gerade; # Elementenanzahl<br />
	scalar @gerade; @gerade.elems; # geht auch<br />
	$#rray; @rray.end; # letzter Index</p>
<p>
Doch auch für das &quot;~@a&quot; wurde noch eine Schreibweise geschaffen, da innerhalb von<br />
doppelten Anführungsstrichen Arrays und Hashes nicht automatisch expandieren. Dies<br />
soll eine einfache Ausgabe von Mailadressen und Prozentangaben ermöglichen.</p>
<p>
Perl 6:<br />
	say @namen;<br />
	say &quot;meine Adresse: <a href="mailto:ich@namen.de">ich@namen.de</a>&quot;;</p>
<p>
Möchte man die Ausgabe der oberen Zeile innerhalb einer Angabe geht das nun auch<br />
so:</p>
<p>
Perl 6:<br />
	say &quot;Die taoistischen Unsterblichen sind: @namen[]&quot;;</p>
<p>
Auch die Ausgabe einzelner Arraywerte kann Umsteiger anfangs ratlos machen, denn<br />
z.B. das vorletzte Element fordert man jetzt mit &quot;@a[*-2]&quot; an. Der Stern bedeutet<br />
jetzt in fast jedem Kontext so etwas wie &quot;alles&quot;, &quot;unendlich&quot;, &quot;irgendetwas&quot; oder<br />
&quot;Grenzwert&quot;. Damit möchte ich aber die Einweisung in Perl 6-Arrays beenden, da<br />
eigentlich die Operatoren das aktuelle Thema sind.</p>
<h3 id="f_C3_BCttern_der_arrays">Füttern der Arrays</h3>
<p>
Das einfache füllen eines Arrays geht wie gewohnt:</p>
<p>
Perl 6:<br />
	my @noten = ('Do', 'Re', 'Mi', 'Fa', 'Sol', 'La', 'Si');</p>
<p>
Die runden Klammern können weggelassen werden, da das Komma jetzt arrayerzeugender<br />
Operator ist. Sonst würde im nächsten Beispiel gerade mal &quot;Si&quot; in &quot;@noten[0]&quot; landen.</p>
<p>
Perl 6:<br />
	my @noten = 'Re', 'Mi', 'Fa', 'Sol', 'La', 'Do', 'Si';</p>
<p>
Aber so würde es wohl auch kein geübter Perlautor schreiben, denn es gibt ja qw().<br />
Gibt es das noch? So etwas praktisches und nützliches wurde nicht nur behalten,<br />
sondern auch in der Schreibweise vereinfacht.</p>
<p>
Perl 6:<br />
	my @noten = &lt;Re Mi Fa Sol La Do Si&gt;;<br />
	my @tiere = &lt;&lt; $baer $hase $igel &gt;&gt;;</p>
<p>
Im vorigen Teil hatte ich ja schon erwähnt das es von &quot;&lt;&gt;&quot; noch eine Version gibt,<br />
die interpoliert. Die Namensgebung lehnt an '' und &quot;&quot; an, wo auch die &quot;doppelte&quot;<br />
Version interpoliert (Variablennamen mit ihren Inhalt ersetzt). Diese Schreibweise <br />
ist auch praktisch wenn dem Array Werte eines Hashes zugewiesen werden.</p>
<p>
Perl 6:<br />
	my @ausgaben = %rechnung&lt; alfred hein peter &gt;;<br />
	my @ausgaben = %rechnung&lt;&lt; @namen[] &gt;&gt;;</p>
<p>
Hashschlüssel wurden zwar vorher auch oft nicht gequotet aber sowas tun nur Rüpel,<br />
da barewords bekanntermaßen böse und hinterhältig sind und liebe Programmierer<br />
immer strict verwenden. In Perl 6 hat man hier keine Wahl, da strictness default<br />
ist, und es keine Bareword-Stringliteral mehr gibt.</p>
<p>
Auch die altbekannten Rangeoperatoren kann man immer noch zum befüllen von Arrays <br />
verwenden:</p>
<p>
Perl 6:<br />
	my @ziffern = 0 .. 9; # 0,1,2,3,4,5,6,7,8,9<br />
	my @buchst ='a'..'z'; # &lt;a b c d e f ... y z&gt;</p>
<p>
Ersteres kann man aber jetzt noch kürzer schreiben:</p>
<p>
Perl 6:<br />
	my @einer = ^10; # 0,1,2,3,4,5,6,7,8,9</p>
<p>
Ja genau, das Dach schließt das ihm Folgende als Grenzwert aus und die 0 wird<br />
standartmäßig als untere Schranke angenommen. Dieses Konstrukt hat vor allem zwei<br />
praktische Anwendungen. Im Skalarkontext kann man damit Bereiche definieren, deren<br />
Schranken nicht zur Menge gehören, aber auch einfache for-Schleifen können so<br />
noch um ein paar Anschläge kürzer geschrieben werden:</p>
<p>
Perl 6:<br />
	3 ~~ 3^.. 7; # gibt Bool::False<br />
	for ^5 { ... } # iteriert 5 mal</p>
<p>
Und da wir grad bei Schleifen sind: Wie oft wollten Perl 5-Programmierer die<br />
Iteratorvariable in Sprüngen oder rückwärts zählen lassen. Dies geht nun alles<br />
sehr einfach:</p>
<p>
Perl 6:<br />
	for ^10:by( 2) {...}; # 0,2,4,6,8<br />
	for 4..1:by(-1) {...}; # 4,3,2,1</p>
<p>
Selbstverständlich ist &quot;by&quot; kein Spezialbefehl für Schleifen, sondern kann immer<br />
für Bereiche (Ranges) eingesetzt werden. Wem es überhaupt nicht gefällt, kann im<br />
zweiten Beispiel auch auf reverse zurückgreifen, denn '4..1' evaluiert zu einer<br />
leeren Menge oder einem leeren Zahlenbereich.</p>
<p>
Perl 6:<br />
	for reverse 1..4 {...}; # 4,3,2,1</p>
<h3 id="es_lebe_die_faulheit">Es lebe die Faulheit</h3>
<p>
Die Menge die ein Perl 6-Array speichert, kann aber nicht nur leer sein, sondern<br />
auch unendlich groß. Dafür braucht es nicht einmal unendlich viel RAM. Es reicht<br />
vollkommen ihn wie folgt als unendlich zu bestimmen:</p>
<p>
Perl 6:<br />
	@zahlen = 5 .. Inf; # von 5 bis Unendlich<br />
	@zahlen = 5 .. <strong>; # das Selbe<br />
	@zahlen =</strong> .. *; # aka -Inf .. +Inf</p>
<p>
Inf (gibt es in den Varianten +Inf und -Inf) oder * steht hier für Unendlich und<br />
es ist auch ein mathematisch korrektes Inf, daß Perl 6 zurückgibt wenn man eine<br />
Division duch 0 versucht. Aber wie funktionieren die letztgenannten Beispiele?<br />
Perl 5 hätte hier unsanft angemeldet &quot;Range iterator outside integer range at ...&quot;,<br />
Perl 6 expandiert jedoch den Array erst wenn er tatsächlich gebraucht wird und<br />
dann auch nur bis zu dem benötigten Element. Diese &quot;lazy evaluation&quot; gehört zu den<br />
Einflüssen funktionaler Sprachen wie Haskell in Perl 6, die ich zu Begin ansprach.<br />
Sie bewirkt, daß eine &quot;for&quot;-Schleife, die über &quot;@zahlen&quot; iteriert, so lange läuft,<br />
bis ein Sprungbefehl das Verlassen der Schleife erzwingt oder das Betriebsystem<br />
aufhört zu arbeiten. Doch im Gegensatz zu Haskell gilt für Perl immer noch TIMTOWTDI.<br />
Wer seine Listen sofort expandiert haben möchte, kann dies mit &quot;eager&quot; erzwingen.</p>
<p>
Perl 6:<br />
	@zahlen = eager 5..*; # jetzt hängt das programm wirklich<br />
	$zahl = lazy &quot;$text:&quot; ~ berechne();</p>
<p>
Im Gegenzug ist es auch möglich mit &quot;lazy&quot; die &quot;lazy evaluation&quot; zu erzwingen, wo<br />
Perl per default &quot;eager&quot; evaluiert, wie bei einer Zuweisung in den Skalarkontext.<br />
Es empfiehlt sich jedoch dabei aufzupassen, da die Variable oder die Routine in<br />
dem Beispiel zu einem späteren Zeitpunkt andere Werte liefern können. Überhaupt<br />
erfordert die &quot;lazy evaluation&quot; etwas mehr Aufmerksamkeit um genau zu erkennen,<br />
wann etwas ausgeführt wird. Das folgende Beispiel filtert die numerisch geraden<br />
Zahlen aus einem Array und überweist sie in einen zweiten Array. Der verwendete<br />
feed-Operators dient der Weiterreichung von Arrayelementen um etwa Schwartz'sche<br />
Transformationen und ähnliches explizit zu formulieren. Neu daran ist, daß die<br />
Werte einzeln &quot;@out&quot; verlassen um sogleich das ganze Fließband an Befehlen zu<br />
passieren und im &quot;@in&quot; zu verschwinden. Im dritten Beispiel würde die gerade Zahl<br />
also zuerst halbiert und in &quot;@in&quot; gespeichert, bevor der nächste Wert aus &quot;@out&quot;<br />
entnommen wird. Diese häppchenweise Arbeitsweise gab den feed-ops ihren Namen.<br />
Das vierte Beispiel demonstriert, daß sie von links nach rechts zuweisen können<br />
und daß sich die Taktstraße auch aus mehreren Quellen speisen kann. Wegen der<br />
Schreibweise &quot;==&gt;&gt;&quot; folgt dem letzten Element aus &quot;@out1&quot; das erste Element aus<br />
&quot;@out2&quot;.</p>
<p>
Perl 6:<br />
	@in = grep { $%2 } &lt;== @out;<br />
	@in = grep { $%2 }, @out; # funktionsgleich<br />
	@in = map {$_ / 2} &lt;== grep { $_%2 } &lt;== @out;<br />
	@out1 ==&gt;&gt; @out2 ==&gt;&gt; grep { /\s/ } ==&gt; @in;</p>
<p>
Selbstverständlich unterbricht ein &quot;eager&quot; oder &quot;sort&quot; die &quot;lazy evaluation&quot; in<br />
solchen Befehlsfolgen.</p>
<p>
Befehle wie push, pop, shift und splice, die auch dafür geeignet sind, Arrays zu<br />
füttern, werden bereits genügend in der perldoc beschrieben. Bis auf Nuancen hat<br />
sich für diese Befehle nichts geändert, weswegen sie hier nicht erklärt werden.</p>
<h3 id="die_raubtierf_C3_BCtterung_geht_weiter">Die Raubtierfütterung geht weiter</h3>
<p>
Wenn einem grad nichts einfällt, kann ein Array natürlich auch mit Wiederholungen<br />
eines Wertes gefüllt werden:</p>
<p>
Perl 6:<br />
	@affen = &quot;gibbon&quot; xx 5;<br />
	# mir ist doch noch was eingefallen<br />
	@affen = &lt;gibbon makake&gt; xx 3;</p>
<p>
Anders als in Perl 5.10 unterscheidet &quot;x&quot; hier keinen Kontext. Es wiederholt, wie<br />
in der vorigen Folge gezeigt, immer einen String und erzeugt einen meist längeren<br />
String. &quot;xx&quot; wiederholt immer eine Liste, selbst wenn sie nur ein Element hat.<br />
Die Ergebnisse werden dann auch, wie anfangs beschrieben, an den Kontext des<br />
Empfängers angepasst. Was Perl 5 leider auch nicht kennt, ist das große &quot;X&quot;, der<br />
Kreuzoperator. Ohne Schleifen und Zusatzmodule können damit alle Kombinationen<br />
der Elemente mehrer Arrays erzeugt werden. Wichtigste Regel ist hier dabei, daß<br />
der linke Array vorrang hat, also zuerst alle Paare mit dem ersten linken Element<br />
gebildet werden, dann mit dem zweiten usw.</p>
<p>
Perl 6:<br />
	1,2 X 3,4 # (1,3),(1,4),(2,3),(2,4)</p>
<p>
Wie das Resultat aufgelöst wird, hängt wieder vom Kontext ab, wobei es an der Zeit<br />
ist, einen neuen, interessanten Kontext vorzustellen. Der &quot;slice&quot;-Kontext, erkennbar<br />
an seiner Sigil &quot;@@&quot;, verweist auf Arrays, die wiederum Arrayreferenzen enthalten.<br />
Slice bedeutet soviel wie Arraystück oder Scheibe. Der einfache Arraykontext würde<br />
einen flachen Array erzeugen. Oft möchte man das gerade nicht.</p>
<p>
Perl 6:<br />
	 $ 1,2 X 3,4 # <a href="http://www.perlfoundation.org/perl6/index.cgi?%5C(1%2C3)%2C%5C(1%2C4)%2C%5C(2%2C3)%2C%5C(2%2C4)" title="[click to create page]" class="incipient">\(1,3),\(1,4),\(2,3),\(2,4)</a><br />
	 @ 1,2 X 3,4 # 1,3,1,4,2,3,2,4<br />
	@@ 1,2 X 3,4 # <a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C3" title="[click to create page]" class="incipient">1,3</a>,<a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C4" title="[click to create page]" class="incipient">1,4</a>,<a href="http://www.perlfoundation.org/perl6/index.cgi?2%2C3" title="[click to create page]" class="incipient">2,3</a>,<a href="http://www.perlfoundation.org/perl6/index.cgi?2%2C4" title="[click to create page]" class="incipient">2,4</a></p>
<p>
Genauso kontextsensitiv ist auch der &quot;zip&quot; Operator, der ebenfalls aus bestehenden<br />
Arrays neue zusammenstellen kann. Er wird &quot;zip&quot; oder &quot;Z&quot; geschrieben und aus der<br />
zweiten Schreibweise läßt sich auch sein Vorgehen ableiten. (Man nehme zuerst ein<br />
Element aus dem linken Array, dann das erste aus dem rechten. Dann wieder zum <br />
ersten und zurück ... ). Zip heißt zu deutsch Reißverschluss, was den Mechanismus<br />
auch gut beschreibt.</p>
<p>
Perl 6:<br />
	 $ 1,2 Z 3,4 # <a href="http://www.perlfoundation.org/perl6/index.cgi?%5C(1%2C3)%2C%5C(2%2C4)" title="[click to create page]" class="incipient">\(1,3),\(2,4)</a><br />
	 @ 1,2 Z 3,4 # 1,3,2,4<br />
	@@ 1,2 Z 3,4 # <a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C3" title="[click to create page]" class="incipient">1,3</a>,<a href="http://www.perlfoundation.org/perl6/index.cgi?2%2C4" title="[click to create page]" class="incipient">2,4</a><br />
	 % 1,2 Z 3,4 # { 1 =&gt; 3, 2 =&gt; 4 }</p>
<p>
Besonders für die parallele Verarbeitung mehrer Arrays in einer Schleife ist das<br />
sehr praktisch. Dies zeigt allerdings die nächste Folge des Tutorials, weil es<br />
noch Wissen zu den inneren Verhaltensweisen anonymer Blöcke verlangt, was weit<br />
außerhalb des heutigen Themas liegt.</p>
<p>
Sowohl der Kreuz- als auch der Reißverschlussoperator kann mehrfach verkettet<br />
werden, die Ergebnisse werden lediglich entsprechend komplexer.</p>
<p>
Perl 6:<br />
	1,2 X 3,4 X 5,6 # (1,3,5),(1,3,6) ...</p>
<h3 id="giga_hyper_meta">Giga, Hyper, Meta ...</h3>
<p>
Mit dem großen Kreuz lässt sich sogar noch weit mehr anstellen wenn es circumfix<br />
(umschließend wie Klammern) um einen anderen Operator gesetzt wird. Dies eröffnet<br />
das völlig neue Feld der Metaoperatoren für Arrays. Operatoren für Skalare können<br />
somit auf Listen angewendet werden und für die Fülle der neuen Möglichkeiten muß<br />
niemand lange Listen an neue Befehlen lernen. Es reicht völlig die Arbeitsweise<br />
der drei Metaoperatoren zu verstehen.</p>
<p>
Der Kreuz-Metaoperator funktioniert auch fast wie der einfache Kreuzoperator. Auf<br />
jedes Kombinationspaar wird lediglich der rechte Operator angewendet. Am Beispiel<br />
ist das leicht nachvollziehbar:</p>
<p>
Perl 6:<br />
	&lt;a b&gt; X~ &lt;1 2&gt; # &lt;a1 a2 b1 b2&gt;<br />
	&lt;1 2 3&gt; X* &lt;2 3&gt; # &lt;2 3 4 6 6 9&gt;</p>
<p>
Der praktische Nutzen von solchem Code ist nicht nur daß er mindestens 5 Zeilen<br />
Perl 5 ersetzt, sondern daß er dem Interpreter auch erlaubt die Arbeitsschritte<br />
auf mehrere Prozessoren(kerne) zu verteilen, da es auch nicht darauf ankommt in<br />
welcher Reihenfolge die Werte berechnet werden, solang sie in der erwarteten<br />
Reihenfolge ankommen. Genau diese Parallelisierung der Datenverarbeitung erlaubt<br />
auch der nächste Metaop: der Hyperoperator. Er besteht aus zwei &quot;&gt;&quot; oder &quot;&lt;&quot;, kann<br />
aber auch mit den UTF-Symbolen namens Chevron geschrieben werden, welche genauso<br />
aussehen. Wie zu erwarten, war das Gegenstand kräftiger Diskussionen, während der<br />
Larry Wall seinen Standpunkt verteidigte: &quot;UTF ist schon lange Standart und man<br />
solle die Verwendung von UTF wenigstens ermöglichen. Alle &quot;UTF-Operatoren&quot; sind<br />
ohnehin optional und Perl 6-Quellcode wird intern eh immer als Unicode angesehen.&quot;</p>
<p>
Der klassische Anwendungsfall für Hyperoperatoren besteht darin, die ersten Werte<br />
zweier Arrays als Operanden zu verwenden und das Resultat als ersten Wert im<br />
Ergebnisarray zu speichern. Nächste Operanden sind die jeweils zweiten Werte u.s.w.<br />
Sind beide Arrays unterschiedlich lang wird mit leeren Werten aufgefüllt</p>
<p>
Perl 6:<br />
	@reste = &lt;5 3 7&gt; &gt;&gt;%&lt;&lt; &lt;2 7 5&gt;; # &lt;1 3 2&gt;<br />
	@summen = &lt;2 3 4&gt; &gt;&gt;+&lt;&lt; 1; # &lt;3 3 4&gt;</p>
<p>
Möchte man einen einzelnen Wert auf eine Liste anwenden, so reicht es, die Richtung<br />
des Hyperoperators umzukehren.</p>
<p>
Perl 6:<br />
	&lt;5 3 7&gt; &gt;&gt;+&gt;&gt; 1; # &lt;6 4 8&gt;</p>
<p>
Das breite Ende der Pfeile zeigt an, welche Seite die Dimension des Ergebnises<br />
bestimmt. Hätte das letzte Beispiel Variablen benutzt, ließe es sich aber noch<br />
elegant verkürzen.</p>
<p>
Perl 6:<br />
	@a = @a &gt;&gt;+&gt;&gt; 1;<br />
	@a &gt;&gt;+=&gt;&gt; 1; # dito<br />
	@a &gt;&gt;++; # noch kürzer</p>
<p>
Sehr nützlich ist auch, daß Hyperoperatoren sehr gut mit mehrdimensionalen Arrays<br />
umgehen können.</p>
<p>
Perl 6:<br />
	-« [<a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C%202" title="[click to create page]" class="incipient">1, 2</a>, 3] # [<a href="http://www.perlfoundation.org/perl6/index.cgi?-1%2C%20-2" title="[click to create page]" class="incipient">-1, -2</a>, -3]<br />
	[<a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C%202" title="[click to create page]" class="incipient">1, 2</a>, 3] »+» <a href="http://www.perlfoundation.org/perl6/index.cgi?4%2C%205%2C%206" title="[click to create page]" class="incipient">4, 5, 6</a> # [<a href="http://www.perlfoundation.org/perl6/index.cgi?5%2C%207" title="[click to create page]" class="incipient">5, 7</a>, 9]<br />
	[<a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C%202" title="[click to create page]" class="incipient">1, 2</a>, 3] «+» <a href="http://www.perlfoundation.org/perl6/index.cgi?4%2C%20%5B5%2C%206" title="[click to create page]" class="incipient">4, [5, 6</a>]<br />
	# == [<a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C2" title="[click to create page]" class="incipient">1,2</a> «+» 4, 3 «+» <a href="http://www.perlfoundation.org/perl6/index.cgi?5%2C%206" title="[click to create page]" class="incipient">5, 6</a>] == [<a href="http://www.perlfoundation.org/perl6/index.cgi?5%2C%206" title="[click to create page]" class="incipient">5, 6</a>, <a href="http://www.perlfoundation.org/perl6/index.cgi?8%2C%209" title="[click to create page]" class="incipient">8, 9</a>]</p>
<p>
Im zweiten Beispiel bestimmt die linke Seite, wegen der Richtung der Operatoren,<br />
die Dimensionalität. Beim dritten ist es keine Seite und so wird auch jedes slice<br />
als Element angesehen und entsprechend &quot;ausmultipliziert&quot;.</p>
<p>
Die dritte Klasse an Metaoperatoren sind die Reduktionsoperatoren. Ihr Name ist<br />
redlich verdient, da sie die Dimension ihres Operanden reduzieren, oder zu deutsch:<br />
Sie machen aus einem Array einen Skalar, indem sie alle Arrayelemente miteinander<br />
anwenden. Reduktionsoperatoren werden in eckigen Klammern geschrieben.</p>
<p>
Perl 6:<br />
	<a href="http://www.perlfoundation.org/perl6/index.cgi?%2B" title="[click to create page]" class="incipient">+</a> 1..4 # 10 = 1+2+3+4<br />
	<a href="http://www.perlfoundation.org/perl6/index.cgi?~" title="[click to create page]" class="incipient">~</a> 'a'..'f' # 'abcdef'</p>
<p>
Trickreich und effektiv lassen sie sich auch mit Vergleichs- und Auswahloperatoren<br />
kombinieren.</p>
<p>
Perl 6:<br />
	$sorted = <a href="http://www.perlfoundation.org/perl6/index.cgi?%3C" title="[click to create page]" class="incipient"><</a> @a # wahr wenn sortiert<br />
	$wert = <a href="http://www.perlfoundation.org/perl6/index.cgi?%7C%7C" title="[click to create page]" class="incipient">||</a> @a # erster nicht leerer Wert im Array<br />
	$min = <a href="http://www.perlfoundation.org/perl6/index.cgi?min" title="[click to create page]" class="incipient">min</a> @zahlen # @zahlen.min ginge auch<br />
	$min, $max = <a href="http://www.perlfoundation.org/perl6/index.cgi?minmax" title="[click to create page]" class="incipient">minmax</a> @zahlen</p>
<p>
Aber auch Reihen, wie man sie beim Mathe-Wettbewerb &quot;Euler&quot; häufig braucht, <br />
lassen sich mit einer weiteren Schreibweise der Reduktionsoperatoren sehr knapp <br />
formulieren.</p>
<p>
Perl 6:<br />
	<a href="http://www.perlfoundation.org/perl6/index.cgi?%5C*" title="[click to create page]" class="incipient">\*</a> 1..3 # 1, 2 = 1*2, 6 = 2*3<br />
	<a href="http://www.perlfoundation.org/perl6/index.cgi?%5C%2B" title="[click to create page]" class="incipient">\+</a> ^10 # 0,1,3,6,10,15,21,28,36,45</p>
<p>
Diese Form liefert die Aufzählung aller Zwischenergebnisse eines Reduktionsops.<br />
Formal hieße sich das ungefähr als &quot;@ergebnis[$n] = @ergebnis[$n-1] op @input[$n]&quot;<br />
ausdrücken. Und auch an dieser Schreibweise erkennt man die Regel einer Huffman-Kodierung<br />
(Je seltener etwas menötigt wird, desto länger (seltsamer) ist sein Name).</p>
<h3 id="und_noch_ein_blick_in_die_quantenwelt">Und noch ein Blick in die Quantenwelt</h3>
<p>
Neben Larry Wall ist Damian Conway einer der Hauptgestalter der Perl 6-Syntax.<br />
Nicht nur die ableitbaren Grammatiken der &quot;rules&quot; basieren zu einem guten Teil<br />
auf seinem &quot;Parse::RecDescent&quot;, auch sein Modul &quot;Quantum::Superpositions&quot; ließ<br />
viele Perl-Programmierer erste Bekanntschaft mit Junctions schließen. Wie vieles<br />
wofür sich Damian begeistert, können auch Junctions als abgehoben und schwer <br />
zugänglich erscheinen. In funktionalen Sprachen wie Haskell erwiesen sie sich<br />
jedoch als hilfreich, um komplexe logische Verknüpfungen einfacher zu formulieren.<br />
Würde man in Perl 5 z.B. noch schreiben:</p>
<p>
Perl 5:<br />
	if ($farbe eq &quot;rot&quot; or $farbe eq &quot;blau&quot; or $farbe eq &quot;grün&quot;) {<br />
		print &quot;Sie wählten eine Grundfarbe, interessant.\n&quot;<br />
	}</p>
<p>
So geht das in Perl 6 auch junktiv.</p>
<p>
Perl 6:<br />
	if $farbe eq &quot;rot&quot; | &quot;blau&quot; | &quot;grün&quot; {<br />
		say &quot;Sie wählten eine Grundfarbe, interessant.&quot;<br />
	}</p>
<p>
Aus Perl 5 ist bekannt, daß &quot;|&quot; für ein logisches &quot;oder&quot;(or) steht, &quot;&amp;&quot; für &quot;und&quot;<br />
(and) und &quot;^&quot; für &quot;entweder oder&quot; (xor) steht. Neu ist, daß man den Sachverhalt:<br />
&quot;rot oder blau oder grün&quot; in einer Variable speichern kann. Das letzte Beispiel<br />
ginge damit so:</p>
<p>
Perl 6:<br />
	my $gfarben = &quot;rot&quot; | &quot;blau&quot; | &quot;grün&quot;;<br />
	if $farbe eq $gfarben ...</p>
<p>
Wem das nicht ganz geheuer kann auch einen vertrauten Array verwenden und dessen<br />
Elemente junktiv verknüpfen.</p>
<p>
	my @gfarben = &lt;rot blau grün&gt;;<br />
	if $farbe eq any(@gfarben) ...</p>
<p>
Sicher ließe sich anstatt &quot;any(@gfarben)<a href="http://www.perlfoundation.org/perl6/index.cgi?%7C" title="[click to create page]" class="incipient">auch die reduktive Variante<!-- wiki-renamed-link | --></a> @gfarben&quot;<br />
verwenden, allerdings ist ersteres weit eingängiger (und aus Quantum::Superpositions<br />
bekannt). In gleicher Weise entspricht das &quot;all<a href="http://www.perlfoundation.org/perl6/index.cgi?%26" title="[click to create page]" class="incipient">einem<!-- wiki-renamed-link & --></a>&quot; (and), &quot;one<a href="http://www.perlfoundation.org/perl6/index.cgi?%5E" title="[click to create page]" class="incipient">dem<!-- wiki-renamed-link ^ --></a>&quot;<br />
(xor) und &quot;none&quot; einem &quot;not&quot;.</p>
<p>
Perl 6:<br />
	if all(@tiere) ~~ all(@affen) { say &quot;nur affen hier ...<br />
	if all(@tiere) ~~ all(@affen) | $faultier { ...<br />
	if schau() | vergleich() eq any(@gfarben) { ...</p>
<p>
Selbstverständlich lassen sich Junctions auch schachteln. Mit ihnen kann man auch<br />
Operationen auf mehrere Werte parallel anwenden, ähnlich den Hyperoperatoren.</p>
<p>
Perl 6:<br />
	my $gfarben = &quot;rot&quot; | &quot;blau&quot; | &quot;grün&quot;;<br />
	$gfarben ~= 'e'; # &quot;rote&quot; | &quot;blaue&quot; | &quot;grüne&quot;;<br />
	(1|2) + (3&amp;4); # (4|5) &amp; (5|6)</p>
<p>
Am schönsten daran ist wohl, daß man so komplexe logische Regelwerke kombinieren<br />
kann und Perl alle Details überläßt.</p>
<h3 id="danke">Danke</h3>
<p>
Über Arrays in Perl 6 lassen sich noch viele weitere Neuerungen berichten. Dieses<br />
mal ging es vor allem um die damit zusammenhängenden Operatoren. In der nächsten<br />
Folge lautet das Thema Kontrollstrukturen. Es wird daran anknüpfen, da Schleifen<br />
oft für die Bearbeitung von Arrays und Hashes eingesetzt werden.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_2" title="(34 months)  toc Perl is an operator based language Unlängst konnte ich herzlich lachen, als ich diesen Satz in ...">Previous Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 2 --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(39 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_4" title="(34 months)  toc Still operators left Nach Operatoren f r Skalare und Operatoren f r Arrays ist sicher Operatore...">Next Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 4 --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_3</guid>
<pubDate>Fri, 06 Aug 2010 23:47:26 -0000</pubDate>
</item>

<item>
<title><![CDATA[Perl 6 Tutorial Part 2]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_2</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#perl_is_an_operator_based_language">Perl is an operator based language</a><!-- wiki: {link: [] Perl is an operator based language} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#ein_wenig_numerik_zum_aufw_C3_A4rmen">Ein wenig Numerik zum aufwärmen</a><!-- wiki: {link: [] Ein wenig Numerik zum aufwärmen} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#algebra_unter_erschwerten_bedingungen">Algebra unter erschwerten Bedingungen</a><!-- wiki: {link: [] Algebra unter erschwerten Bedingungen} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#noch_mehr_numerik_zum_vertiefen">Noch mehr Numerik zum vertiefen</a><!-- wiki: {link: [] Noch mehr Numerik zum vertiefen} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#operatoren_des_stringkontext">Operatoren des Stringkontext</a><!-- wiki: {link: [] Operatoren des Stringkontext} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#vergleichsoperatoren">Vergleichsoperatoren</a><!-- wiki: {link: [] Vergleichsoperatoren} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#der_dritte_skalarkontext">Der dritte Skalarkontext</a><!-- wiki: {link: [] Der dritte Skalarkontext} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#schlu_C3_9Fendlich_die_auswahloperatoren">Schlußendlich .. die Auswahloperatoren</a><!-- wiki: {link: [] Schlußendlich .. die Auswahloperatoren} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><h3 id="perl_is_an_operator_based_language">Perl is an operator based language</h3>
<p>
Unlängst konnte ich herzlich lachen, als ich diesen Satz in der p6l-Mailingliste<br />
sah. Der wahre Kern dieser Pointe besteht darin, daß Perl 6 tatsächlich auffallend<br />
viele Operatoren besitzt und das Operatoren einen bedeutenden Anteil an Perl's<br />
Ausdrucksstärke haben. Und weil Operatoren bereits mit wenig Quellcode angewendet<br />
werden können, eignen sie sich vortrefflich als Einstieg in die Tiefen der Sprache.<br />
Letztlich ist ihre Kenntnis auch eine wichtige Vorraussetzung für spätere,<br />
umfangreichere Beispiele.</p>
<h3 id="ein_wenig_numerik_zum_aufw_C3_A4rmen">Ein wenig Numerik zum aufwärmen</h3>
<p>
Beginnen wir ganz einfach mit den geläufigsten Operatoren, den Grundrechenarten<br />
('+', '-', '*'), die jeder Insasse dieser Zivilisation vom Grundschullehrer nahe<br />
gebracht bekommt.</p>
<p>
Perl 6:<br />
	say 3 + 4; # 7<br />
	say 3 - 4; # -1<br />
	say 3 * 4; # 12</p>
<p>
Ebenso zeigte euch der freundliche Mathelehrer auch die Division, Modulo (Rest<br />
einer ganzzahligen Division) und Potenzierung, nur werden die in Computersprachen<br />
etwas anders geschrieben als im Unterricht, da man hier in den alten Tagen auf<br />
den ASCII-Zeichensatz beschränkt war.</p>
<p>
Perl 6:<br />
	say 3 / 4; # 0.75<br />
	say 3 % 4; # 3 ( 3 div 4 = 0 Rest 3 )<br />
	say 3 ** 4; # 81 ( = 3 * 3 * 3 * 3 )</p>
<h3 id="algebra_unter_erschwerten_bedingungen">Algebra unter erschwerten Bedingungen</h3>
<p>
So weit erfüllen die Ergebnisse die Erwartungen eines Mathematikers und zeigen,<br />
daß @larry noch wissen, welche Dinge sie besser nicht ändern. Was Mathematiker<br />
jedoch nicht erwarten, aber sehr wohl Perl-Programmierer kennen, die mit Daten<br />
zweifelhafter Herkunft hantieren, sind Zahlenwerte, die Buchstaben enthalten<br />
können. Diese übergeht Perl großzügig, in dem es alles ab dem ersten Zeichen<br />
ignoriert, daß nicht als Zahl interpretiert werden kann. Das wird<br />
Überführung eines Wertes in den numerischen Kontext genannt und geschieht immer<br />
dann, wenn Perl anhand der verwendeten Operatoren erkennt, daß hier mit Zahlen<br />
gerechnet wird. Folgende Beispiele geben gleiche Ergebnisse unter Perl 5 und 6<br />
aus. Die Kommanotation von 'print' hab ich deswegen gewählt, damit die Beispiele<br />
wirklich unter Perl 5 und 6 laufen, da Strings in beiden Sprachen unterschiedlich<br />
zusammengefügt werden.</p>
<p>
Perl 5 &amp; 6:<br />
	print 3 * '2.2j4',&quot;\n&quot;; # 6.6, da 3 * 2.2<br />
	print 3 * 'b2.2j4',&quot;\n&quot;; # 0, da 3 * 0<br />
	print - '2.2ah',&quot;\n&quot;; # -2.2, einfache Negierung</p>
<p>
Die Unterschiede beginnen, wenn man das '+' als Präfixoperator benutzt.</p>
<p>
Perl 5 &amp; 6:<br />
	print + '2.3ah',&quot;\n&quot;;<br />
	print int '2.3ah'; # 2<br />
	print abs '-2.4ah'; # 2.4</p>
<p>
Während Perl 5 dieses '+' ignoriert, überführt es in Perl 6 den folgenden String<br />
in den numerischen Kontext, wie das '-' in Perl 5 und 6, nur ohne zu negieren.<br />
Zwar gab es bereits in Perl 5 'int', welches ganze Zahlen zurückgibt und 'abs'<br />
das positive Zahlenwerte liefert, aber eine einfache und direkte Umwandlung in<br />
den numerischen Kontext gab es erstaunlicherweise bisher nicht.</p>
<h3 id="noch_mehr_numerik_zum_vertiefen">Noch mehr Numerik zum vertiefen</h3>
<p>
Perl 6:<br />
	say + '2.3ah'; # 2.3<br />
	say - '2.0ah'; # - 2</p>
<p>
Diese Beispiele sind es wert, längere Zeit meditativ betrachtet zu werden. Denn<br />
sie beschreiben eine grundlegende Arbeitsweise vieler Operatoren. Perl 6 kennt<br />
nämlich nicht nur Skalar, Array und Hashkontext, sondern noch viele mehr, wie<br />
zum Beispiel den numerischen Kontext. Dessen Symbol ist quasi das '+', welches<br />
diesen nicht nur erzwingt sondern auch Sigil für eine Reihe von Operatoren ist,<br />
die ebenfalls diesen Kontext forcieren. Sie sind bereits als bitverändernde Ops<br />
bekannt, aber äusserlich kaum wiederzuerkennen. Die guten, alten Shiftoperatoren<br />
werden jetzt z.B.'+&lt;' und '+&gt;' geschrieben, wie das nächste Beispiel zeigt. Das<br />
sieht zuerst ungewohnt aus, ist aber logisch, weil meist nur der numerische Wert,<br />
den eine Zeichenkette ausdrückt, für Bitoperationen gebraucht wird. Ausserdem sind<br />
'&lt;&lt;' und '&gt;&gt;' jetzt interpolierende Schwestern der '&lt;' und '&gt;'-Klammern geworden.<br />
So wie &quot;&quot; interpolierende Schwestern von '' sind. Analog zum Erklärten sind die<br />
bitweisen 'und'(and), 'oder'(or) und 'entweder-oder'(xor) nun '+&amp;', '+|' und '+^'.<br />
Die einfachen logischen Operatoren '&amp;', '|' und '^' sind jetzt junktiv. Das werde<br />
ich genauer im Teil 3 erklären, weil es auch den Umgang mit Arrays berührt.</p>
<p>
Perl 6:<br />
	say 5 +&lt; 2; # 20; 10100 = 101 &lt;&lt; 2<br />
	say 5 +&gt; 2; # 1; 001 = 101 &gt;&gt; 2<br />
	say 5 +&amp; 3; # 1; 001 = 101 &amp; 011<br />
	say 5 +| 3; # 7; 111 = 101 | 011<br />
	say 5 +^ 3; # 6; 110 = 101 ^ 011</p>
<p>
Die meisten sonstigen numerischen Operatoren bleiben wie bekannt, lediglich das<br />
Autoincrement (++) und Autodecrement (--) sind nun keine reinen numerischen Op's<br />
mehr. Bevor ihr einen Herzschlag bekommt: klar verändern sie Zahlenwerte um 1.<br />
Aber sie erzwingen keinen Kontext, sondern passen sich ihm an. Denn sie sind<br />
allgemeine Operatoren geworden, die den Vorgänger oder Nachfolger eines Wertes<br />
rufen und bedienen sich daher des gleichen Mechanismus wie einige Vergleichsops.<br />
Ähnlich brechnen auch 'div' und 'mod' (auf Zahlen angewendet) Division und Modulo, <br />
können sich aber einem anderen Kontext auch anpassen.</p>
<p>
Perl 6:<br />
	my $a = 5;<br />
	say ++$a; # 6 (5 + 1)<br />
	say $a++; # 6 (erhöht wird danach)<br />
	say --$a; # 6 (6 + 1 - 1)<br />
	say $a--; # 6 (verringert wird danach)<br />
	say $a --; # Error</p>
<p>
Routinierte Perlprogrammierer sollten nicht vergessen, daß jetzt zwischen Variable<br />
und ihrem Präfix- oder Suffixoperator kein Leerzeichen stehen darf. Die Gründe<br />
hab ich im vorigen Teil des Tutorials dargelegt.</p>
<h3 id="operatoren_des_stringkontext">Operatoren des Stringkontext</h3>
<p>
Analog zum numerischen gibt es, wie erwarted, auch einen Stringkontext, dessen<br />
Symbol '~' ist. Warum die Tilde? Nun, weil der ultimative Textoperator '=~' hieß,<br />
also Tilde schon immer etwas mit Strings zu tun hatte und der Punkt, wie letzes<br />
mal schon gezeigt, nun die Objektorientierung ausdrückt. Die Tilde wandelt also<br />
in den Stringkontext um und kann auch Strings verknüpfen, wie der Unixbefehl 'cat',<br />
den es jetzt auch innerhalb von Perl gibt.</p>
<p>
Perl 6:<br />
	say ~ '2.3ah'; # '2.3ah'<br />
	say ~ '2.0'; # '2.0'<br />
	say ~ 0xff; # 255<br />
	say 'rot ' ~ 'blau' # 'rot blau'<br />
	say cat('rot ', 'blau'); # dito<br />
	say 'Farbe:' ~ color(); # eine Testausgabe</p>
<p>
Die Tilde kann aber auch genauso mit den bitveränderndem Operatoren kombiniert<br />
werden, wie im numerischen Paralleluniversum das Plus. Auch wenn ich bis heute<br />
keinen praktischen Nutzen, für die daraus entstehenden Operatoren gefunden habe,<br />
will ich nicht ausschließen das es einen gibt. Die Tilde signalisiert, daß die<br />
Werte zeichenweise in Ordinalzahlen umgewandelt werden (mit 'ord'). Auf die so<br />
entstandenen Reihen numerischer Werten, können nun die bitweisen Rechenarten<br />
problemlos angewendet werden. Lediglich beim shiften muß der rechte Operand eine<br />
Zahl sein. Die Ergebnisse werden dann selbstverständlich vor der Ausgabe wieder<br />
mit 'chr' in Textzeichen umgewandelt.</p>
<p>
Perl 6:<br />
	'-' ~&lt; 1 ; #'Z'= chr 90 ( 45 &lt;&lt; 1 )<br />
	'z' ~&gt; 1 ; #'='= chr 61 ( 122 &gt;&gt; 1 )<br />
	'a' ~&amp; 'D'; #'@'= chr 64 (1100001 &amp; 1000100)<br />
	'a' ~| 'D'; #'e'= chr 101 (1100001 | 1000100)<br />
	'a' ~^ 'D'; #'%'= chr 37 (1100001 ^ 1000100)</p>
<p>
Perl 6 kennt aber erfreulicherweise auch die bekannten Befehle zur Bearbeitung von<br />
Zeichenketten wie 'index', 'substr', 'uc', 'lc' und so fort und sogar rubysche<br />
Spielereien wie reverse, welches die Reihenfolge der Zeichenkette umkehrt. Genau<br />
genommen sind das aber eingebaute Funktionen und keine Operatoren, um die es hier<br />
geht. Die bestehen aus wenigen, nicht alphanumerischen Zeichen. Obwohl, das <br />
stimmt eigentlich auch nicht, denn Perl 6 kennt ebenfalls noch das kleine 'x',<br />
mit dem Perlschreiber schon früher Strings vervielfältigten.</p>
<p>
Perl 6:<br />
	'a' x 5; # 'aaaaa'<br />
	'so' x 3; # 'sososo'</p>
<p>
Bei wirklich komplexen Fällen, führt jedoch kein Weg an den regulären Ausdrücken<br />
vorbei! Die nennen sich jetzt rules und bieten derart viele Möglichkeiten, daß<br />
sie hier mindestens einen eigenen Teil benötigen. Deswegen folgen jetzt nur wenige<br />
Beispiele um den in Perl 5.10 eingeführten Smartmatchoperator zu demonstrieren.<br />
Dieser ersetzt in Perl 6 das '=~' vollständig.</p>
<p>
Perl 6:<br />
	&quot;Ich hab getanzt ...&quot; ~~ m/tanz/; # 1<br />
	&quot;Ich hab getanzt ...&quot; !~~ m/wanze/; # 1<br />
	&quot;Ich hab getanzt ...&quot; ~~ s/tan/schwit/; # Error</p>
<p>
Im Gegensatz zu Perl 5 liefert er aber nur einen boolschen Wert zurück, der den<br />
Erfolg der Suche meldet. (Auch beim Ersetzen.) '!~~' negiert am Ende der Suche<br />
lediglich diesen Ergebniswert. Jede weitere Information zum Suchvorgang können<br />
Programmierer wie gewohnt den Spezialvariablen entehmen, deren Syntax sich auch<br />
geändert hat. Die Fehlermeldung im Beispiel ist der Tatsache geschuldet, daß nur<br />
in Variablen, aber nicht in konstanten Ausdrücken ersetzt werden kann.</p>
<h3 id="vergleichsoperatoren">Vergleichsoperatoren</h3>
<p>
Die neue Arbeitsweise des '~~' erklärt sich einfach mit dem Umstand, daß es ein<br />
Vergleichoperator wie '==' ist. Der gibt ja auch nur wahr oder falsch zurück.<br />
(im perlschen Sinne) Ohne zu übertreiben kann man sogar sagen, das '~~' der<br />
Endgegner unter den Vergleichsoperatoren ist, noch weit mächtiger als bereits in<br />
Perl 5.10. Je nach Typ und Inhalt seiner Operanden versucht er in jeder Lage<br />
etwas sinnvolles abzuliefern und hat dazu eine große Tabelle, die Vorrang und<br />
Kompatibilität aller internen Perlobjekte zueinander angibt. Das hat von Natur<br />
aus immer etwas mit Unschärfe zu tun und tatsächlich sieht '~~' ein wenig aus,<br />
wie das Symbol für das Wort circacirca.</p>
<p>
Das genauer Gegenteil dazu ist der Operator '===', der die Identität, also Inhalt<br />
und Typ zweier Werte vergleicht. Wem das immer noch nicht genau genug ist, kann<br />
noch auf 'eqv' zurückgreifen, welches zusätzlich Laufzeiteigenschaften beachtet.</p>
<p>
Perl 6:<br />
	<a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C2" title="[click to create page]" class="incipient">1,2</a> === <a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C2" title="[click to create page]" class="incipient">1,2</a>; # 0<br />
	'3.0' === 3; # 0</p>
<p>
Das erste Beispiel ergab negativ, weil es Referenzen (heißen jetzt Captures) auf<br />
2 unterschiedliche Arrays sind. Das zweite ist ebenfalls negativ, weil für Perl<br />
offensichtlich ist, daß der linke Operand ein String ist und der rechte numerisch.</p>
<p>
Gewöhnlich entgehen jedoch Perl-Programmierer solchen Problemen, in dem sie auch<br />
beim Vergleich den bevorzugten Kontext erzwingen. Wie in Perl 5 zeigen Ops aus <br />
mathematischen Symbolen ('&lt;','&gt;','&lt;=','&gt;=','==') den numerischen Kontext an.<br />
Vergleichsops aus Buchstaben ('lt','gt','le','ge','eq') vergleichen zeichenweise.</p>
<p>
Perl 6:<br />
	<a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C2" title="[click to create page]" class="incipient">1,2</a> == <a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C2" title="[click to create page]" class="incipient">1,2</a>; # 1<br />
	'3.d' == 3; # 1<br />
	<a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C2" title="[click to create page]" class="incipient">1,2</a> eq <a href="http://www.perlfoundation.org/perl6/index.cgi?1%2C2" title="[click to create page]" class="incipient">1,2</a>; # 1<br />
	 3.0 eq 3; # 1</p>
<p>
Mit anderen Worten: '$a eq $b' ist eine Kurzschreibweise für '~$a === ~$b' und<br />
'$a == $b' kann auch '+$a === +$b' formuliert werden. Was aber tun, wenn nicht<br />
bekannt ist, ob man Zeichen oder Zahlen vergleichen wird? Dann nimmt man '~~',<br />
was aber nur gut gehen kann, wenn beide Vergleichswerte immer noch den gleichen<br />
Typ haben.</p>
<p>
Perl 6:<br />
	 '5' ~~ 5.0; # 1<br />
	'du' ~~ 'du'; # 1<br />
	 3.0 ~~ '3f'; # 0</p>
<p>
Die oberhalb aufgezählten Vergleichsops brauchen wohl kaum eine Vorstellung,<br />
auch nicht ihre negierte Form (mit einem '!' davor). Selbst die verkürzten Formen<br />
der 'ungleich'-Operatoren (numerisch '!=' für '!==') und (im string Kontext 'ne'<br />
für '!eq'), haben bereits vor langer Zeit ihren Platz in der Perl-Folklore <br />
gefunden (jeweils beide Schreibweisen sind in Perl 6 erlaubt). Und doch steckt<br />
auch hier eine neue verallgemeinerte Logik hinter diesen Operatoren, denn es gibt<br />
weit mehr sortierbare Dinge als Zahlen und Buchstaben, die man praktischerweise<br />
mit einem Operator befragen kann, ob sie sich in der gewünschten Reihenfolge<br />
befinden. Die Ops dafür sind 'before' und 'after', die leider derzeit noch nicht<br />
von Pugs verstanden werden.</p>
<p>
Perl 6:<br />
	say 3 before 5; # 1<br />
	say 'b' after 'a'; # 1</p>
<p>
Somit ist klar, daß '$a &gt; $b' eine andere Schreibart für '+$a after +$b' ist und<br />
'$a lt $b' auch als '~$a before ~$b' ausgedrückt werden kann. All die bisherigen<br />
Vergleichsop haben jedoch gemeinsam, daß sie ein wahr oder falsch liefern. Nun,<br />
eigentlich ist es ein 'Bool::True' oder 'Bool::False', die im normalen, numerischen<br />
Kontext zu 1 oder 0 evaluiert werden, doch heben wir uns diese Spitzfindigkeiten<br />
für später auf, wenn das interne Objektsystem ansteht. Selbst wenn ich mehrere<br />
Vergleiche kombiniere, wie in:</p>
<p>
Perl 6:<br />
	say 3 &lt; $b &lt; 7; # wird in 1 Zug ausgewertet<br />
	say 3 &lt; $b == $b &lt; 7;# in 2 Zügen ausgewertet</p>
<p>
erhalte ich einen boolschen Wert, da nur 2 verschiedene Ergebnisse möglich sind.<br />
Im allgemeinen Vergleich sind es jedoch 3: kleiner als, gleich und größer als.<br />
Was sich in den Rückgabewerten, wie in P5, als <del>1, 0 und 1 ausdrückt. Aber vor<br />
der Umwandlung in den Ergebniskontext ist es ein 'Order::Increase', 'Order::Same'<br />
oder 'Order::Decrease'. Diese und weitere internen Methoden sind auch dafür sehr<br />
nützlich, daß ein Modul wie DateTime sie mit eigenen Routinen überladen kann. <br />
(So etwas wie &quot;Tie&quot; gibt es hier nicht mehr.) Stellt dann der Befehl 'cmp' fest,<br />
daß er hier 2 Objekte vom Typ DateTime vergleichen soll und die Parameterlisten<br />
der bereitgestellten Methoden auch zu den Operanden passen, werden sie verwendet.<br />
Und voila, 'cmp' kann auch Zeitpunkte vergleichen. Ähnlich arbeiten auch '++' und<br />
'-</del>', die ebenfalls dank mitgelieferter Methoden, Vorgänger- und Nachfolger eines<br />
Objektinhaltes ermitteln können. Jetzt hat mancher Perlkundiger sicher gerufen: <br />
&quot;Aber 'cmp' forciert doch den Stringkontext?&quot;. Richtig, in Perl 5, aber nicht in<br />
Perl 6. Hier steht 'cmp' wirklich für 'compare' (vergleiche). Soll beim Vergleich<br />
auf numerischen Kontext geachtet werden, so benutze man das bekannte '&lt;=&gt;', im<br />
Strinkontext allerdings 'leg'. Das hört sich ausgesprochen 'LowerEqualGreater'<br />
an und ist parallel zu &lt;=&gt;, an die Anfangsbuchstaben der Namen der verwandten<br />
Ops 'lt', 'eq', 'gt' angelehnt.</p>
<h3 id="der_dritte_skalarkontext">Der dritte Skalarkontext</h3>
<p>
In diesem Text wurde es schon einige Male unterschwellig erwähnt, Perl 6 kennt<br />
auch einen boolschen Kontext. Und er wird mit dem '?' gefordert, da einfache<br />
Fragen auch meist mit ja oder nein beantwortbar sind. Wie der numerische, so<br />
kennt der boolsche auch einen verneinenden Operator: das Ausrufungszeichen. Eine<br />
Umwandlung in den boolschen Kontext tat man bisher eher implizit, z.B. beim<br />
einsetzen einer Variable in eine if-Bedingung oder in Verbindung mit logischen<br />
Operatoren. Jetzt geht es überall und explizit, auch mit 'true' oder 'not':</p>
<p>
Perl 6:<br />
	say ? '2.3ah'; # 1<br />
	say true 0 ; # 0<br />
	say ! '2.3ah'; # ''<br />
	say not ''; # 1</p>
<p>
Und sicher gibt es hier ebenfalls die kontexterzeugenden Bitoperatoren. Hier macht<br />
es auch ein wenig mehr Sinn als bei Texten. Nur nicht für die Shiftoperatoren,<br />
denn bei einem Bit Registerbreiter, gibt es nichts zu shiften.</p>
<p>
Perl 6:<br />
	say 0 ?&amp; 'aha'; # 0<br />
	say 3 ?| '2.3'; # 1<br />
	say '' ?^ 4 ; # 1</p>
<p>
Steht das '?^' vor einem einzelnem Operanden, entspricht es einem '!' oder not.</p>
<h3 id="schlu_C3_9Fendlich_die_auswahloperatoren">Schlußendlich .. die Auswahloperatoren</h3>
<p>
Bei den logischen Operatoren gibt es noch eine wohlbekannte Gattung, die den<br />
Kontext der Werte nicht verändert, auch wenn sie intern mit den Umwandlungen der<br />
Werte in den boolschen Kontext rechnet. Ich nenne sie Auswahloperatoren, da sie<br />
den Wert eines Operanden zurückliefern. Manche nennen sie Kurzschlußoperatoren,<br />
da sie vorzeitig abbrechen, wenn das Ergebnis absehbar ist. Das kann man dazu <br />
nutzen, Befehle bedingt ausführen zu lassen. Ich halte meine Bezeichnung für<br />
treffender, da einer aus dieser Gattung (xor), diese Eigenschaft nicht besitzt.<br />
Ihr Syntax wird durch die Wiederholung des logischen Operatorzeichens gebildet.</p>
<p>
Perl 6:<br />
	say 0 &amp;&amp; 'aha'; # 0<br />
	say 4 and 0 ; # 0<br />
	say 3 || 0 ; # 3<br />
	say 0 or 5 ; # 5<br />
	say '' ^^ 4 ; # 4<br />
	say 7 xor 4 ; # ''</p>
<p>
Der mittlere Op hat eine recht neue Variante, die erst Perl 5.10 kennt. Sie nennt<br />
sich defined-or und liefert nur dann den rechten Wert, wenn der linke undefniert<br />
ist. Die 3 Operatoren des letzten Listings haben noch eine Schreibweise, in der<br />
sie mit niedriger Priorität (in einem Ausdruck als Letzte) ausgeführt werden.<br />
('and' statt '&amp;&amp;', or statt '||' und xor statt '^^'). Diese wird gebraucht um<br />
Terme logisch zu verknüpfen, ohne allzuviel Klammern benutzen zu müssen, die die<br />
Lesbarkeit erschweren würden.</p>
<p>
Wirklich neu ist in dem ganzen nur das 'orelse'. Es funktioniert exakt wie ein<br />
'or', nur das die Spezialvariable '$!' des linken Blocks, auch im rechten Block<br />
weiterbesteht, falls dieser ausgeführt werden sollte. Dadurch wird dieser Befehl<br />
nützlich, um in knapper Form einen Aufruf oder kleinen Block mit einem zweiten zu<br />
verknüpfen, der im Falle eines Problems, die Fehlermeldung des Ersten auswerten<br />
kann. Entsprechend überträgt andthen $_ in den zweiten Block und führt diesen aus,<br />
wenn der erste erfolgreich war.</p>
<p>
Perl 6:<br />
	do {...} orelse { say $! }<br />
	do {...} andthen { say $_ }</p>
<p>
Der wiederum vertraute, ternäre Operator ist nicht direkt ein Auswahloperator, <br />
funktioniert aber ähnlich und wurde auch optisch den Auswahloperatoren angepaßt.<br />
Das war anders kaum möglich, da Fragezeichen, wie bekannt, jetzt den boolschen<br />
Kontext erzwingen.</p>
<p>
Perl 6:<br />
	$a = defined $b ?? $b !! $c;<br />
	$a = $b // $c; # kürzer</p>
<p>
Die kaum noch bekannten Flipflopops wurden umbenannt, um Verwechslungen mit den<br />
gleichnamigen Bereichsoperator zu vermeiden ('..' zu 'ff' und '...' zu 'fff').<br />
Dateitestoperatoren wurden den Perl 6-Konventionen angepaßt und werden nun mit<br />
':' statt '-' am Anfang geschrieben. Sie haben auch negierte Versionen (':!')<br />
und können additiv gestapelt aber auch sonstig explizit als Junctions logisch <br />
verknüpft werden.</p>
<p>
Perl 6:<br />
	if $datei ~~ :e { say 'gibts' }<br />
	if $datei.:!e { say 'gabs' }<br />
	if $datei :r :w :x { ... }<br />
	if $datei :r | :x { ... }</p>
<p>
Ich glaube das waren ausreichende Indizien für mein Argument, daß Perl 6 eine<br />
operatorbasierende Sprache ist. Mehr wäre auf einmal auch schwer aufzunehmen.<br />
Die bisher nicht Erwähnten Operatoren , die vor allem Arrays betreffen, wir der<br />
nächste Teil beschreiben.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_1" title="(29 months)  toc Motivation for a friendly Perl 6 tutorial Perl 6 appears slowly before the wondering eyes of th...">Previous Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 1 --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(39 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_3" title="(34 months)  toc Arrays in Perl Und wie angekündigt geht es in dieser Folge um Operatoren, die den Umgang mit Ar...">Next Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 3 --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_2</guid>
<pubDate>Fri, 06 Aug 2010 23:44:53 -0000</pubDate>
</item>

<item>
<title><![CDATA[Perl 6 Tutorial]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial</link>
<description><![CDATA[<div class="wiki">
<p>
This tutorial was written for <a target="_blank" title="(external link)" href="http://perl-magazin.de/">$foo Perl magazine<!-- wiki-renamed-hyperlink "$foo Perl magazine"<http://perl=-magazin.de/> --></a> and was published from winter 2007 until autumn 2009, later also in the <a target="_blank" title="(external link)" href="http://wiki.perl-community.de/cgi-bin/foswiki/view/Wissensbasis/Perl6Tutorial">wiki of the german Perl community<!-- wiki-renamed-hyperlink "wiki of the german Perl community"<http://wiki.perl=-community.de/cgi=-bin/foswiki/view/Wissensbasis/Perl6Tutorial> --></a>. Much editing is being done afterwards to keep the content valid, because Perl 6 is still moving. To understand this tutorial you need basic Perl and general programming skills. Most terms are explained on the way. If you would like to deepen your knowledge, read the <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tablets" title="(14 months) These are the Perl 6 Tablets, a comprehensive manual, aimed to support many different ways of learni...">Perl 6 Tablets</a>.</p>
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_1" title="(29 months)  toc Motivation for a friendly Perl 6 tutorial Perl 6 appears slowly before the wondering eyes of th...">Part 1 : Basic Syntax<!-- wiki-renamed-link Perl 6 Tutorial Part 1 --></a></p>
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_2" title="(34 months)  toc Perl is an operator based language Unlängst konnte ich herzlich lachen, als ich diesen Satz in ...">Part 2 : Operators for Scalars<!-- wiki-renamed-link Perl 6 Tutorial Part 2 --></a></p>
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_3" title="(34 months)  toc Arrays in Perl Und wie angekündigt geht es in dieser Folge um Operatoren, die den Umgang mit Ar...">Part 3 : Operators for Arrays<!-- wiki-renamed-link Perl 6 Tutorial Part 3 --></a></p>
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_4" title="(34 months)  toc Still operators left Nach Operatoren f r Skalare und Operatoren f r Arrays ist sicher Operatore...">Part 4 : Hashes and control structures<!-- wiki-renamed-link Perl 6 Tutorial Part 4 --></a></p>
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_5" title="(34 months)  toc Captures und Subroutinen Willkommen zum fünften Teil dieses ausführlichen Perl 6-Tutorials, der...">Part 5 : Captures and Subroutines<!-- wiki-renamed-link Perl 6 Tutorial Part 5 --></a></p>
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_6" title="(34 months)  toc Objects and Roles Willkommen und hereinspaziert mein Damen und Herren. Hier erleben sie Mensche...">Part 6 : Objects and Roles<!-- wiki-renamed-link Perl 6 Tutorial Part 6 --></a></p>
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_7" title="(34 months)  toc Text, Rules and Grammars Willkommen zum siebenten Teil dieses poetischen Perl 6-Tutorials, da v...">Part 7 : Text, Rules and Grammars<!-- wiki-renamed-link Perl 6 Tutorial Part 7 --></a></p>
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_8" title="(34 months)  toc Herzlich willkommen auch zum achten und letzten Teil dieses tiefsch rfenden Tutoriums f r werde...">Part 8 : Introspection and Metaprogramming<!-- wiki-renamed-link Perl 6 Tutorial Part 8 --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial</guid>
<pubDate>Sat, 13 Mar 2010 00:50:02 -0000</pubDate>
</item>

</channel>
</rss>