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

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

<channel>
<title><![CDATA[Perl 6: Perl 6 Tutorial Part 4]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_4</link>
<description></description>
<pubDate>Fri, 06 Aug 2010 23:50:09 -0000</pubDate>
<webMaster>synedra@gmail.com</webMaster>
<generator>Socialtext Workspace v2.14.7.2</generator>

<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="(38 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>

</channel>
</rss>