IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Perl - Komplexe Datenstrukturen in Perl



Komplexe Datenstrukturen in Perl

Es werden Referenzen und komplexere Datenstrukturen wie z.B. "list of lists" kurz in diesem Artikel vorgestellt.


Autor: Franz Schaefer (mond)
Datum: 10-03-2002, 18:09:49
Referenzen: man perlreftut
man perlref
man perldata
man perldsc
man perllol
Schwierigkeit: Anfänger
Ansichten: 6166x
Rating: Bisher keine Bewertung.

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Übersicht

bis jetzt kennen wir folgende perl datenstrukturen: skalare (einfache
zahlen, strings), arrays und hashes. eine referenz ist jetzt ein perl
interner verweis (C programmierer werden hier an pointer denken) auf
beliebige andere datenstrukturen. angenemmoen wir haben ein array mit dem
namen @array und ein assoziatives array mit dem namen %hash:

$aref = \@array;
$href = \%hash;

die variable $aref enthaelt jetzt eine referenz auf dieses @array und wir
koennen mithilfe von $aref auf die felder des arrays zugreifen. detto mit
$href.

print ${$aref}[3];

wuerde jetzt z.b. das element 4te element (wir beginnen ja ueblicherweise
bei 0 zu zaehlen) unseres arrays @array ausgeben. WICHTIG ist es zu
verstehen dass bei der zuweisung $aref = \@array KEINE kopie angelegt wird
sondern nur ein verweis. d.h. aendert man z.b. werte mithilfe von $aref so
aendern sich auch die werte im original array mit.

ist alerdings schwer zu
lesen. ueblicherweise verwendet man die elegantere schreibweise:

print $aref->[3];

das -> erinnert an einen pfeil und verdeutlicht den verweis-character von
referenzen. ebenswo wuerde z.b.:

$href->{'ort'}='1160 wien';

in dem hash auf den $href verweist den schluessel 'ort' mit der zuordnung
'1160 wien' belegen. (die schreibweise ${$href}{'ort'} waere ebenfalls
zulaessig aber wieder schwer zu lesen.)

referenzen sind nun selbst skalare und koennen selbst elemente von arrays
oder hashes sein. wir koennen damit jetzt komplexe datenstrukuren wie
arrays von arrays von hashes von arrays aufbauen...

$b[0]=$aref;

zum zugriff auf dieses feld koennten wir jetzt z.b. schreiben;

print $b[0]->[3];

es gibt jedoch die regel wonach man einen -> zwischen zwei subscripts
weggelassen werden kann. damit kann man das ganze so schreiben:

$b[0][3]="xyz";

sieht ja schon aus wie ein 2 dimensionales array. aber auch folgendes perl
programm waere legal:

#!/usr/bin/perl -w
use strict;
my @array=("ah","baeh","buh");
my %hash=( 'ort' => 'wien',
'alter' => 32,
'name' => 'franz' );
my $aref=\@array;
my $href=\%hash;
my @b=();
$b[0]=$aref;
$b[1]=$href;
print $b[1]{'name'},"\n";
print $b[0][2],"\n";

um array referenzen bequemer initalisieren zu koennen gibt es folgende
schreibeweise:

$feldref = ["ah", "baeh", "buh" ];

$feldref ist jetzt eine referenz auf ein array mit drei string elementen.
(bei einem normalen array haetten wir oben runde klammern verwendet).
analog koennten wir z.b.

@a = ( [1, 2, 3],
[4, 5, 6],
);

ein array anlegen dessen elemente refernezen auf wieder arrays sind.
entspricht damit einer matrix mit 2 zeilen und 3 spalten.

eine schleife die alle obige elemente ausgibt koennte z.b. so aussehen:

foreach my $zeile (@a) {
print "neue zeile\n";
foreach my $spalte (@$zeile) {
print $spalte, " ";
}
print "\n";
}

anonyme hashes koennen wir mit {} initalisieren:

$hashref={ 'ort' => 'hinterholz 8', 'name' => 'alfred' };

dem aufbau komplexer datenstrukturen steht jetzt nichts mehr im wege. die
manpages perlref, perldsc, perlreftut, perllol haben noch weitere
beispiele. (so kann man z.b. auch referenzen auf codestuecke haben.. wie
wir schon gesehen haben machen das z.b. ja auch unsere objekte die wir vom
DBI modul oder vom CGI modul bekommen) aber das wichtigste sollte soweit
klar sein.

EXERCISES:

* schreibe ein perlscript dass das /etc/passwd file einliest und alle
zeilen als array in einem hash speichert dessen schluessel der username
ist. erzeuge ein zweites hash dessen schluessel die userid ist und das
auf die selben array elemente zeigt.

teste ob die datenstruktur tatsaechlich so aussieht wie du denkst in dem
du die werte aus der struktur am ende in einer schleife wieder ausgibst.

* schreibe eine sub funktion die referenzen auf 2 diminsionale arrays
akzeptiert und das 2 matrizen (oder vektoren falls eine dimension 0 ist)
multiplizieren kann. als ergebniss soll eine referenz auf ein
ergebnissarray zurueckgeliefert werden.

_______________________________________________
CD ist ein service von SILVER SERVER
der inhalt unterliegt der GFDL
_______________________________________________



[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04503
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16551
Queueeinträge:06238
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1137
Comments: 0