18.10.2013 Aufrufe

PDF-Version - freiesMagazin

PDF-Version - freiesMagazin

PDF-Version - freiesMagazin

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!