malte: mehr-d hash überschreibt sich selber - wieso?

hallo, das hash %daten_all soll unter einer $id bestimmte URLs mit IPs, Beschreibungen (DESCR), Ports und einer von mir zuvor festgelegtn Priorität (PRIO) speichern.

Die bestehenden Daten liegen im folgenden Format vor:
URL#DESCR#PRIO#IP#PORT, also z.b.
www.google.de#Suchmahscine#1#123.456.789.101#80

foreach(@arr_daten) {
 @arr_daten_splitted = split(/#/,$_); # Daten als Array
 $url = @arr_daten_splitted[0];
 $descr = @arr_daten_splitted[1];
 $prio = @arr_daten_splitted[2];
 $ip = @arr_daten_splitted[3];
 $port = @arr_daten_splitted[4];
 $id++;
 %daten_all = ( $id => {'URL',$url,'DESCR',$descr,'PRIO',$prio,'IP',$ip,'PORT',$port})

}

wenn ich jetzt z.b. "print $daten_all{2}{DESCR};" mache, bekomme ich nix. einzige möglichkeit ist die ID des letztens hash elements (in meinem fall gibt es 56 datensätze, also "print $daten_all{56}{DESCR}"), die dann DESCR, IP, PORT etc ausgeben kann.

ich dachte, dass ein hash nur auf keinen "key hört", wenn ich also einen neuen key generiere ($id++) darf perl das doch nicht über den vorherigen speichern, oder?

was habe ich falsch gemacht?

danke für eure hilfe!

  1. Hi,

    @arr_daten_splitted = split(/#/,$_); # Daten als Array
    $url = @arr_daten_splitted[0];
    $descr = @arr_daten_splitted[1];
    $prio = @arr_daten_splitted[2];
    $ip = @arr_daten_splitted[3];
    $port = @arr_daten_splitted[4];

    wozu dient hier das Array?

    %daten_all = ( $id => {'URL',$url,'DESCR',$descr,'PRIO',$prio,'IP',$ip,'PORT',$port})
    ich dachte, dass ein hash nur auf keinen "key hört", wenn ich also einen neuen key generiere ($id++) darf perl das doch nicht über den vorherigen speichern, oder?

    Nein, darf es nicht. Wenn Du aber die Variable überschreibst, darf es nichts anderes tun, als die Variable zu überschreiben. Egal, was vorher mal drin war.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      @arr_daten_splitted = split(/#/,$_); # Daten als Array
      $url = @arr_daten_splitted[0];
      $descr = @arr_daten_splitted[1];
      $prio = @arr_daten_splitted[2];
      $ip = @arr_daten_splitted[3];
      $port = @arr_daten_splitted[4];

      wozu dient hier das Array?

      weil ich, wie gesagt insgesamt 56 datensätze der form: www.google.de#Suchmahscine#1#123.456.789.101#80 habe... und die werden nun gesplittet um sie in das hash zu speichern

      %daten_all = ( $id => {'URL',$url,'DESCR',$descr,'PRIO',$prio,'IP',$ip,'PORT',$port})
      ich dachte, dass ein hash nur auf keinen "key hört", wenn ich also einen neuen key generiere ($id++) darf perl das doch nicht über den vorherigen speichern, oder?

      Nein, darf es nicht. Wenn Du aber die Variable überschreibst, darf es nichts anderes tun, als die Variable zu überschreiben. Egal, was vorher mal drin war.

      welche Variable? id hat doch in jedem schleifendruchgang einen anderen wert. und %daten_all wird doch nicht überschrieben, sondern nur ein neues element (ansprechbar mit der neuen id) erzeugt, oder?

      malte

      1. @arr_daten_splitted = split(/#/,$_); # Daten als Array
        $url = @arr_daten_splitted[0];
        $descr = @arr_daten_splitted[1];
        $prio = @arr_daten_splitted[2];
        $ip = @arr_daten_splitted[3];
        $port = @arr_daten_splitted[4];

        wozu dient hier das Array?

        weil ich, wie gesagt insgesamt 56 datensätze der form: www.google.de#Suchmahscine#1#123.456.789.101#80 habe... und die werden nun gesplittet um sie in das hash zu speichern

        Das ist schon klar, beantowrtet aber nicht die Frage.

        Es stellt sich ausserdem die Frage ob du mit use strict arbeitest? Damit lassen sich viele Tippfehler und Nachlässigkeiten vermeiden.

        %daten_all = ( $id => {'URL',$url,'DESCR',$descr,'PRIO',$prio,'IP',$ip,'PORT',$port})
        ich dachte, dass ein hash nur auf keinen "key hört", wenn ich also einen neuen key generiere ($id++) darf perl das doch nicht über den vorherigen speichern, oder?

        Nein, darf es nicht. Wenn Du aber die Variable überschreibst, darf es nichts anderes tun, als die Variable zu überschreiben. Egal, was vorher mal drin war.

        welche Variable? id hat doch in jedem schleifendruchgang einen anderen wert. und %daten_all wird doch nicht überschrieben, sondern nur ein neues element (ansprechbar mit der neuen id) erzeugt, oder?

        Nein, du überschreibst %daten_all komplett, dazu dient der Zuweisungsoperator.

        Struppi.

        1. weil ich, wie gesagt insgesamt 56 datensätze der form: www.google.de#Suchmahscine#1#123.456.789.101#80 habe... und die werden nun gesplittet um sie in das hash zu speichern

          Das ist schon klar, beantowrtet aber nicht die Frage.

          ??? Zweck des Arrays: die einzelnen Informationen, die durch eine Raute getreent sind einzulesen um so einfacher darauf zuzugreifen

          Es stellt sich ausserdem die Frage ob du mit use strict arbeitest? Damit lassen sich viele Tippfehler und Nachlässigkeiten vermeiden.

          ja

          welche Variable? id hat doch in jedem schleifendruchgang einen anderen wert. und %daten_all wird doch nicht überschrieben, sondern nur ein neues element (ansprechbar mit der neuen id) erzeugt, oder?

          Nein, du überschreibst %daten_all komplett, dazu dient der Zuweisungsoperator.

          ok, danke

          Struppi.

          1. Das ist schon klar, beantowrtet aber nicht die Frage.
            ??? Zweck des Arrays: die einzelnen Informationen, die durch eine Raute getreent sind einzulesen um so einfacher darauf zuzugreifen

            Dafür ist das Array aber nicht nötig.

            Du willst eigentlich:

            my($var_1, $var_2, var_3 ... ) = split /#/, $string:

            Struppi.

          2. Hallo malte,

            weil ich, wie gesagt insgesamt 56 datensätze der form: www.google.de#Suchmahscine#1#123.456.789.101#80 habe... und die werden nun gesplittet um sie in das hash zu speichern

            Das ist schon klar, beantowrtet aber nicht die Frage.
            ??? Zweck des Arrays: die einzelnen Informationen, die durch eine Raute getreent sind einzulesen um so einfacher darauf zuzugreifen

            ich finde daran überhaupt nichts einfaches. Du legst ein Array an,
            obwohl du es nicht benötigst.

            foreach(@arr_daten) {
            @arr_daten_splitted = split(/#/,$_); # Daten als Array
            $url = @arr_daten_splitted[0];
            $descr = @arr_daten_splitted[1];
            $prio = @arr_daten_splitted[2];
            $ip = @arr_daten_splitted[3];
            $port = @arr_daten_splitted[4];
            $id++;
            %daten_all = ( $id => {'URL',$url,'DESCR',$descr,'PRIO',$prio,'IP',$ip,'PORT',$port})
            }

              
              
            my %daten_all;  
              
            foreach (@arr_daten) {  
               ( $daten_all{$id}{URL}  
               , $daten_all{$id}{DESCR}  
               , $daten_all{$id}{PRIO}  
               , $daten_all{$id}{IP}  
               , $daten_all{$id}{PORT}  
               ) = split /#/, $_;  
               $id++;  
            }  
            
            

            Auf diese Weise sieht es auch noch strukturiert aus, denn 56
            Zuweisungen in einer Zeile mittels

            my ($val1, $val2 ... $val56) = split /#/, $_

            schauen nicht so toll aus.

            Greez,
            opi

            --
            Selfcode: ie:( fl:( br:^ va:) ls:] fo:) rl:( n4:? ss:| de:] ch:? mo:|