PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrdimensionales Array unter Perl?



Eagle
10-12-2002, 15:14
Hallo,

da ich in Perl-Programmierung noch relativ grün bin, hoffe ich, hier kann mir jemand das Wie zeigen.

Ich will aus einer Datei 86 Namen mit 86 Altersangaben und 86 Grössenangaben in ein Array einlesen, so dass zum dem jeweiligen Namen das Alter und die Grösse passt.
Aus einer Liste wie

Adel
27
165
Alexandra
25
174
Diane
26
178

soll folgendes Array werden:

Adel 27 165
Alexandra 25 174
Diane 26 178

Der Inhalt von Element (2,0) sollte also Diane sein.

Kann mir jemand erklären, wie ich das unter Perl realisieren kann? Vor allem möchte ich nachher nach Name, Alter und Grösse sortieren können, so dass eben wieder alles bestens zusammen passt was zusammen gehört.

Für Eure Hilfe bereits besten Dank im Voraus!

Gruss

Andreas

fork
11-12-2002, 17:44
Mehrdimensionales Array:

@multi=( ["adel", "27", "167"],
["Kathrin", "22", "177"]);

Also ich persönlich finde assotiative Array's(=Hashes) wesentlich aussagekräftiger und lesbarer.

Beispiel:

#!/usr/bin/perl
# Die folgende Zuweisung laesst sich natuerlich auch verkuerzen
$personen{"adel"}{"alter"}=27;
$personen{"adel"}{"groesse"}=167;
$personen{"Kathrin"}{"alter"}=22;
$personen{"Kathrin"}{"groesse"}=187;

foreach(keys %personen) {
print "$_\t: ".$personen{$_}{"groesse"}."\n";
}

Gruß
Tobias

Eagle
12-12-2002, 19:07
Besten Dank, Tobias,

für Dein aufschlussreiches Beispiel. Aber gibt es da eine Möglichkeit
aus einer ASCII-Datei so einzulesen, dass dann das

@multi=( ["adel", "27", "167"],
["Kathrin", "22", "177"]);

herauskommt? Also die Einträge sehen in der Datei natürlich so aus

adel 27 167
Kathrin 22 177 usw.

Ich weiss, dazu habe die Dateihandels über die ich mit

open <INPUT "datei">

Daten zeilenweise einlesen kann.

Aber wie muss ich schreiben, dass mir Perl das schön in das assoziative Array einliest, wie Du es mir so beispielhaft gezeigt hast?

Ich danke Dir für Deine Bemühungen,

Gruss

Andreas

fork
12-12-2002, 19:36
so etwa:

#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my %person;
my @temp;
open(FILE,"<datei.txt") or die "Kann Datei nicht oeffnen: $!\n";
while(<FILE>){
chomp();
@temp=split();
$person{"$temp[0]"}{"alter"}=$temp[1];
$person{"$temp[0]"}{"groesse"}=$temp[2];
}
close(FILE);
foreach(keys %person) {
print "$_ : Alter: ".$person{"$_"}{"alter"}.
" Grösse : ".$person{"$_"}{"groesse"}."\n";
}

Gruß
Tobias

Eagle
17-12-2002, 09:34
Hallo Tobias,

ich benötige noch einmal Dein Knowhow, um die Sache besser zu verstehen. Dein Skript
nutze ich, abgewandelt, um aus einer Datei daten.dat mit folgender Struktur

Diane 27 178
Ariane 25 174

die Werte in ein assoziatives Array zu schreiben:

#!/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
my %data;
my @temp;
my @array;
my $i;
my $j;
open(FILE,"<daten.dat") or die "Kann Datei nicht oeffnen: $!\n";
while(<FILE> ){
chomp();
@temp=split();
$data{"$temp[0]"}{"alter"}=$temp[1];
$data{"$temp[0]"}{"groesse"}=$temp[2];
}
close(FILE);
foreach(keys %data) {
$i = 0;
$array[$i]="$_";
$i = $i + 1;
}
for ($j = 0; $j <= $i; $j++){
print "Nr. $j: $array[$j] \n";
}


Ich möchte jetzt allerdings auf alle Elemente des Arrays seperat zugreifen können, weil ich

a) entweder nach Alter, Name oder Grösse sortieren möchte,
b) den Namen seperat benötige, um eine Tabelle zu erzeugen.

Wie kann ich also auf die einzelnen Elemente dieses assoziativen Array zugreifen und die gewünschten Werte in
einer Liste array für meine weiteren Zwecke ablegen? Jedenfalls liest mein Versuch da oben nur
Ariane ein und spuckt auch nur sie in der neuen Liste aus.

Als Nächstes interessiert mich natürlich der Befehl, den ich zum Sortieren benötige.

Vielen Dank für Deine Unterstützung

Andreas

fork
17-12-2002, 18:16
foreach(keys %data) {
$i = 0;
$array[$i][0]="$_";
$array[$i][1]=$data{"$_"}{"alter"};
$array[$i][2]=$data{"$_"}{"groesse"};
$i = $i + 1;
}

> Als Nächstes interessiert mich natürlich der Befehl, den ich zum Sortieren benötige.

Ich kann Dir da "Einführung in Perl" von O'Reilly empfehlen, ein sehr gutes Buch.

Gruß
Tobias