hash in hash bzw. wie lege ich das am günstigsten an
piet
- perl
Hallo,
ich möchte ein hash wie folgt anlegen.
daten -> "messwert_1" -> format ("dezimal")
-> Adresse ("192.x.x.x")
-> Reserve_1 ("Res1")
-> Reserve_2 ("Res2")
-> "messwert_2") -> format ("dezimal")
-> Adresse ("192.x.x.x")
-> Reserve_1 ("Res1")
-> Reserve_2 ("Res2")
Es soll durch den Inhalt einer Datei, die in csv gespeichert ist, gefüllt werden. Wie greife ich dann auf die einzelne Felder zu z.B.
print $daten{"messwert_1"}{format}
bzw.
$daten{"messwert_1"}{format} = "bool"
Ist dann das so richtig, oder gibt es eine bessere Variante ??
Danke piet
hallo
Ist dann das so richtig, oder gibt es eine bessere Variante ??
vielleicht.
Von einer CSV ausgehend wäre ein Array mit Hashreferenzen naheliegend: [{},{}..]
. Auf jeden Fall brauchst Du hierzu die Feldnamen die zum Schlüssel in jeder Hashreferenz werden.
MfG
Using Hash-Slice
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
use strict;
use warnings;
my @res = ();
my @fields = qw(Format Address Reserve1 Reserve2);
while( my $lin = <DATA> ){
chomp $lin;
my %hunt = ();
@hunt{ @fields } = split /;/, $lin;
push @res, \%hunt;
}
print Dumper \@res;
__DATA__
dezimal;192.168.1.2;Res1;Res2
dezimal;192.168.1.3;Res3;Res4
Ergebnis
$VAR1 = [
{
'Address' => '192.168.1.2',
'Format' => 'dezimal',
'Reserve1' => 'Res1',
'Reserve2' => 'Res2'
},
{
'Address' => '192.168.1.3',
'Format' => 'dezimal',
'Reserve1' => 'Res3',
'Reserve2' => 'Res4'
}
];
Weils so schön is.
Hallo,
ich habe mich eventuell falsch ausgedrückt.
In der csv steht es z.B. so
innentemperatur ; 23.5 ; dez ; 192.1.x.x ; Res1 ; Res2
aussentemperatur ; 13.5 ; hex ; 172.1.x.x ; Res1 ; Res2
Im Hash (kein array) soll stehen
messwertname = innentemperatur; messwert = 23.5; format = dez; adresse = 192.x.x.x; Reserve_1 = Res1; Reserve_2 = Res2
messwertname = aussentemperatur; messwert = 13.5; format = hex; adresse = 172.x.x.x; Reserve_1 = Res1; Reserve_2 = Res2
Wie greife ich lesend/schreibend auf das jeweilige hash-Feld zu und wie gebe ich die "zielfelder" bei split an bzw. wie erweitere ich jeweils das hash bei jeder neuen Zeile aus der csv ?
= split /;/, $lin;
vielen Dank
Danke
Wenn Du einen Hash haben willst, braucht Du je Record (Zeile in CSV) eine eindeutige Kennung. Da wäre mein Code nur geringfügig zu ändern: Statt auf das Array zu pushen wird halt dem Schlüsssel (eindeutige Kennung) die Hashreferenz zugewiesen.
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
use strict;
use warnings;
#my @res = ();
my %res = (); # Hash of Hashes
my @fields = qw(ID Format Address Reserve1 Reserve2);
while( my $lin = <DATA> ){
chomp $lin;
my %hunt = ();
@hunt{ @fields } = split /;/, $lin;
#push @res, \%hunt;
$res{ $hunt{ID} } = \%hunt;
}
print Dumper \%res;
__DATA__
234;dezimal;192.168.1.2;Res1;Res2
99;dezimal;192.168.1.3;Res3;Res4
Ausgabe
$VAR1 = {
'234' => {
'Address' => '192.168.1.2',
'Format' => 'dezimal',
'ID' => '234',
'Reserve1' => 'Res1',
'Reserve2' => 'Res2'
},
'99' => {
'Address' => '192.168.1.3',
'Format' => 'dezimal',
'ID' => '99',
'Reserve1' => 'Res3',
'Reserve2' => 'Res4'
}
};
MfG
Hallo und Danke …
hat ein bisschen gedauert, jetzt verstanden ;-)