<?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 2]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_2</link>
<description></description>
<pubDate>Fri, 06 Aug 2010 23:44:53 -0000</pubDate>
<webMaster>synedra@gmail.com</webMaster>
<generator>Socialtext Workspace v2.14.7.2</generator>

<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="(28 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="(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_3" title="(33 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>

</channel>
</rss>