piet: hash in hash bzw. wie lege ich das am günstigsten an

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

  1. hallo

    Ist dann das so richtig, oder gibt es eine bessere Variante ??

    vielleicht.

    https://perldoc.perl.org/perldsc.html

  2. 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

    1. 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.

      1. 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

        1. 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

          1. Hallo und Danke …

            hat ein bisschen gedauert, jetzt verstanden ;-)