PDF-Version - freiesMagazin
PDF-Version - freiesMagazin
PDF-Version - freiesMagazin
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
say $magisches_quadrat ->[1]->[0];<br />
# sagt: 1<br />
say $magisches_quadrat ->[1][0];<br />
# sagt: 1<br />
Den zweiten Pfeil kann man weglassen, da Perl<br />
auch so weiß, was gemeint ist. Nur den ersten<br />
Pfeil muss man dazu schreiben, um Zweideutigkeiten<br />
zu vermeiden. Folgendes ist ein völlig anderer<br />
Ausdruck:<br />
say $magisches_quadrat [0][0];<br />
Das erste Beispiel war ein Skalar, der auf ein Array<br />
zeigt. Im zweiten Beispiel bekommt man ein<br />
Element eines Arrays. Zufällig ist es eine Array-<br />
Referenz, von der wiederum das erste Element<br />
verlangt wird. Das ist eine Struktur, die so definiert<br />
wurde:<br />
my @magisches_quadrat = (<br />
[8,1,6],<br />
[3,5,7],<br />
[4,9,2],<br />
);<br />
Jetzt lichtet sich auch der Nebel um die Aussage,<br />
dass Referenzen die Bedeutung der Sigel stören.<br />
$magisches_quadrat[0] sieht nach einem Skalar<br />
aus, ist aber in Wirklichkeit ein Array. Oder zumindest<br />
eine Referenz auf einen Array.<br />
Richtig unelegant wird es, möchte man das Array,<br />
auf den $magisches_quadrat[0] zeigt, in eine<br />
andere Array-Variable kopieren:<br />
my @zeile = @{ $magisches_quadrat [0] };<br />
Hier reicht es nicht, den gewollten Kontext zu erzwingen,<br />
indem man nur ein @ davor setzt wie<br />
bei @$aref. Die geschweiften Klammern müssen<br />
klarstellen, dass nicht $magisches_quadrat,<br />
sondern $magisches_quadrat[0] in den Array-<br />
Kontext gesetzt werden muss. Jetzt kann das =<br />
die Brücke spannen und Klone der Schäfchen<br />
auf der Weide rechts wandern brav über den<br />
Bach in @zeile hinein.<br />
my $zeile = $magisches_quadrat [0];<br />
Das wäre zwar einfacher, aber in dem Fall erhält<br />
man nur die Adresse einer Zeile (Unterarray) in<br />
@zeile. Wird ein Schubfach von $zeile->[0]<br />
aus entleert, gibt es auch nichts mehr von<br />
$magisches_quadrat[0][0] aus gesehen.<br />
Hashes verstöpseln<br />
Hashes in Hashes, Hashes in Arrays, gerichtete<br />
Graphen, die Wege über Königsberger Brücken,<br />
fast jede erdenkliche Datenstruktur kann gebaut<br />
werden, wenn man nach den gleichen Regeln<br />
auch Referenzen auf Hashes verwendet. Als abschließendes<br />
Beispiel sei eine Struktur erzeugt,<br />
die Spielstände eines Schachspiels speichern<br />
kann. Dazu braucht es einen Hash mit den<br />
Schlüsseln A bis H (die Spalten). Jeder Wert ist eine<br />
Referenz auf ein Array der Länge 8 (0..7, die<br />
Zeilen). Natürlich könnte man auch ein Array mit<br />
Hash-Referenzen aufziehen, aber so lässt sich<br />
später schreiben:<br />
say $feld{'A'}[3];<br />
# sagt: "Dame"<br />
PROGRAMMIERUNG<br />
Das entspricht der gewohnten Sprache der<br />
Schachspieler und erzeugt weniger Verwirrung.<br />
Hochtrabend wird dieses Prinzip auch „Domain-<br />
Driven Design“ (DDD) genannt und sagt eigentlich<br />
nicht mehr als: „Schreibst du für jemand ein<br />
Programm, dann verwende seine Logik und seine<br />
Fachvokabeln.“<br />
Perl hat die wunderbare Eigenschaft, eine solche<br />
Struktur nicht vorbereiten zu müssen. Nach<br />
einem simplen my %feld; könnte man die Abfrage<br />
$feld'A'[3]; machen und bekommt nur<br />
ein korrektes undef als Ergebnis. Man ist hier<br />
halt weniger streng als anderswo. Während dieser<br />
Aktion geschah aber heimlich, still und leise<br />
noch etwas, was Außenseiter nicht erwarten.<br />
Um im Unterarray nachsehen zu können, wurde<br />
im Hash der Schlüssel A angelegt und in seinem<br />
Wert die Referenz auf einen ebenfalls neu<br />
erschaffenes, leeres Array abgelegt. In kaum einer<br />
anderen Sprache gibt es diese „Autovivifikation“.<br />
Sie erlaubt unvorbereitete Zuweisungen<br />
wie $feld'D'[55] = 'Läufer';, sagt aber leider<br />
auch niemals nein, selbst wenn eine Zeile 55<br />
ausgesprochen unerwünscht ist.<br />
Noch ein letzter Hinweis: Ist es dennoch gewünscht,<br />
die beschriebene Datenstruktur aufzubauen,<br />
sind for und ähnliche Befehle sehr nützlich.<br />
Anstatt alles auszuschreiben<br />
my %feld = (<br />
A => [0,1,2,3,4,5,6,7],<br />
B => [0,1,2,3,4,5,6,7],<br />
...<br />
© <strong>freiesMagazin</strong> CC-BY-SA 3.0 Ausgabe 12/2011 38