Mehrdimensionale ArraysPerl

SeitenanfangSeitenendeBeschreibung am Beispiel

Vorwiegend werden zweidimensionale Arrays verwendet. Daher bleiben auch wir hier in der zweiten Dimension ...

In der Mathematik gibt es den Begriff der Matrix. Eine Matrix ist ein zwei-dimensionales Array. Man betrachtet meherere Zeilen gleicher Länge, in der z. B. Zahlen stehen:

      /        \
     |  1 17  5 |
     |  3  6 11 |
 A = | 10 77 20 |; A2,3=11; A1,3=5; etc.
     | 13  7  2 |
      \        /
 

Das wäre jetzt ein Beispiel für eine Matrix mit 4 Zeilen und 3 Spalten - eine sog. (4x3)-Matrix. (Statt der vier senkrechten Striche und die Schrägstriche links und rechts schreibt man normalerweise jeweils eine große runde Klammer.) Will man den Eintrag in der i-ten Zeile und der j-ten Spalte ansprechen, so schreibt man Ai,j. A2,3 wäre dann der Wert 11.

SeitenanfangSeitenendeUmsetzung: So geht es nicht!

Es geht nicht so:

@Zeile0=(1, 2, 3, 4);
@Zeile1=(5, 6, 7, 8);
@Zeile2=(9, 0, 1, 2);

@A=(@Zeile0, @Zeile1, @Zeile2)

print "@A\n\n";

# oder so:

@A=((1, 2, 3, 4),
    (5, 6, 7, 8),
    (9, 0, 1, 2));

print "@A\n";

1 2 3 4 5 6 7 8 9 0 1 2

1 2 3 4 5 6 7 8 9 0 1 2

Also die Sache mit dem Konstrukt Arrays von weiteren Arrays - wie es in vielen anderen Programmiersprachen gelöst ist - kann man nicht verwenden, um ein zweidimensionales Array zu bauen!

Stattdessen muss man hier einen "Umweg" gehen: Man arbeitet mit einem Array von Referenzen auf Arrays. Das funktioniert, da Referenzen skalare Daten sind:

SeitenanfangSeitenendeArray von Referenzen auf anonyme Arrays

Eigentlich ist das nichts neues. Auf den Seiten vorher haben wir bereits Referenzen und anonyme Arrays kennengelernt - interessant wird es nur, wie man auf ein zweidimensionales Array zugreift:

@A=( [1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 0, 1, 2] );


print ${$A[1]}[2]."\n\n";
print "@{$A[0]}\n\n";

foreach $ref (@A) {
  print join(", ", @$ref)."\n";
}
7

1 2 3 4

1, 2, 3, 4
5, 6, 7, 8
9, 0, 1, 2

Und das fällt auf:

Das Array @A enthält Referenzen (Speicheradressen) auf Arrays! $A[0] ist also eine Referenz auf das anonyme Array [1, 2, 3, 4]. Um an den Inhalt des Arrays heranzukommen, ist es nötig zu dereferenzieren: @{$A[0]}. Perl würde ohne den Klammern versuchen $A zu derefernzieren. Durch die Klammerung bezieht sich Perl auf $A[0] - was wir ja wollen. Analog ist die Dereferenzierung, wenn man auf einzelne Elemente des zweidimensionalen Arrays zugreifen will: ${$A[1]}[2].

Mit der foreach-Schleife wird hier ganz normal das Array abgearbeitet - nur dass man eben mit Referenzen zurückbekommt: Als erstes die Referenz auf das anonyme Array [1, 2, 3, 4], als nächstes die Referenz auf [5, 6, 7, 8] und schließlich noch die Referenz auf [9, 0, 1, 2]. Und wie man mit einer Referenz auf ein Array verfährt, kennen wir ja schon von früher.

SeitenanfangSeitenendeArray von Referenzen auf Arrays

Eigentlich ist ein Array von Referenzen auf Arrays nichts anderes als oben. Der einzige Unterschied ist der, dass statt anonyme Arrays ganz normale Arrays verwendet werden. Das heißt ganz einfach, dass die Arrays, auf die die Referenzen zeigen mit Variable vorhanden - eben nicht anonym - sind.

@Z1=('arno', 'bert', 'dino');
@Z2=('emil', 'franz', 'gert');
@Z3=('hans');

@A=(\@Z1, \@Z2, \@Z3);


print ${$A[1]}[2]."\n\n";
print "@{$A[0]}\n\n";

foreach $ref (@A) {
  print join(", ", @$ref)."\n";
}

Das fällt auf:


Seitenanfang FehlermeldungHilfe zur Fehlermeldung © 2001-2003 Email an den AutorPerl, Lehrstuhl Mathe II, Uni Bayreuth