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

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

</channel>
</rss>