Gleiche Schlüsselnamen in einem Hash

Gleiche Schlüsselnamen in einem Hash

am 17.09.2006 17:41:24 von neurob

Hallo zusammen,

ich plane für mich gerade ein "größeres" Projekt in Perl, bei dem
ich folgendes Problem habe. Ich habe mehrere Computer, bei denen ich
zB. die Konfiguration auslesen will. Diese Daten liegen in der Form

Name=3DAAAAA
SerialNr=3D0015634
Version=3DV5.2.1
usw.

vor und ich möchte diese mittels ($schlüssel, $wert) =3D split /=3D/,$_
in einem Hash speichern. Jetzt ist es aber so, daß die Hashschlüssel
öfters vorkommen und das ja nicht geht. Ich habe mir jetzt gedacht,
ich verknüpfe den Hashschlüssel mit dem Computernamen, bin da aber
nicht wirklich glücklich drüber. Evtl. Hashes von Hashes? Wie wird
das von den Profis gelöst?

Gruß Robert

Re: Gleiche Schlüsselnamen in einem Hash

am 17.09.2006 22:26:44 von Helmut Wollmersdorfer

neurob wrote:

> Evtl. Hashes von Hashes?

Ich würde bei sowas HoH (Hash of Hash) verwenden.

Helmut Wollmersdorfer

Re: Gleiche Schlüsselnamen in einem Hash

am 18.09.2006 10:37:04 von Mirco Wahab

Thus spoke neurob (on 2006-09-17 17:41):

> ich plane für mich gerade ein "größeres" Projekt in Perl, bei dem
> ich folgendes Problem habe. Ich habe mehrere Computer, bei denen ich
> z.B. die Konfiguration auslesen will. Diese Daten liegen in der Form
> Name=AAAAA
> SerialNr=0015634
> Version=V5.2.1
>
> vor und ich möchte diese mittels ($schlüssel, $wert) = split /=/,$_
> in einem Hash speichern. Jetzt ist es aber so, daß die Hashschlüssel
> öfters vorkommen und das ja nicht geht. Ich habe mir jetzt gedacht,
> ich verknüpfe den Hashschlüssel mit dem Computernamen, bin da aber
> nicht wirklich glücklich drüber. Evtl. Hashes von Hashes?

Die Frage muss (imho) zuerst sein - *was* willst Du
hinterher damit anstellen, in welcher Form hättest
Du in einer "idealen Welt" darauf gerne zugegriffen ;-)

Rein intuitiv hätte ich vielleicht (anders als Helmut)
erstmal ein Array genommen, dessen Werte je ein "Record"
(anonymes Array) pro Rechner sind (so, wie sie kommen).

$name = 'AAAAA';
$ser = '0015634';
$ver = 'V5.2.1';

push @arr, [ $name, $ser, $ver ];

Hier braucht man keinen Hash, wenn die
Indices und die Art der Daten je immer
die Selben sind, also:

use constant NAME => 0;
use constant SERIAL => 1;
use constant VERSION => 2;

Das mache ich erstmal für alle Rechner - kann
man dann auch abspeichern oder sowas.

Wenn ich eine Indizierung per irgendwas brauche,
lese ich das Array in einen Hash ein:

my %by_names;
$by_names{ $_->[NAME] } = $_ for @arr;

oder

my %by_serials;
$by_serials{ $_->[SERIAL] } = $_ for @arr;

Darauf kann man dann später wieder "normal" zugreifen:

...
$record = $by_names{'AAAAA'};
$n = $record->[NAME];
$s = $record->[SERIAL];
$v = $record->[VERSION];
...

So ungefähr ... (Hoffentlich haben sich nicht
zu viele Fehler eingeschlichen.)

Viele Grüße

Mirco