günther: Wie Zeile (ohnne Schlüssel/Wert) in ein hash einlesen?

Hallo Perl-Experten,

ich möchte eine Zeile splitten und in ein hash einlesen:

%hash = (
feld1 => 'stuff',
feld2 => 'stuff'',
feld3 => 'stuff'
)

Die Zeile sieht so aus:
inhalt1inhalt2inhalt3

splitten und in ein array einlesen kann ich, aber direkt in ein hash?
wie ordne ich die Werte den Schlüsseln zu?

field1 <-- inhalt1
field2 <-- inhalt2
...

PS: Archiv und perldoc hab ich brav durchgekämmt ;-) oder :-(

Danke für Tipps!
Günther

  1. Sup!

    Wenn Du keine vernünftigen Schlüssel hast, warum nimmst Du nicht ein Array?

    Gruesse,

    Bio

    1. Hallo Bio,

      Wenn Du keine vernünftigen Schlüssel hast, warum nimmst Du nicht ein Array?

      aehm...siehe Posting:
      "splitten und in ein array einlesen kann ich..."

      Bitte nicht:
      Frage: ich suche ein rotes Tuch
      Antwort: nimm ein blaues Tuch

      Grüße,
      günther

      1. Hallo Günther,

        Bitte nicht:
        Frage: ich suche ein rotes Tuch
        Antwort: nimm ein blaues Tuch

        ich würde zwar auch das blaue nehmen, aber wenn's unbedingt rot sein sollte (sicherlich nur eine Variante):

        while(<IN>)
          {
          chomp;
          my(@content) = split('',$_);
          my($i);
          for $i (0 .. $#content)
            {
            $content{"feld$i"} = $content[$i];
            }
          }

        oder vielleicht

        @Schluessel = ("ABRA","KADA","BRA","SIM","SALA","BIM");
        while(<IN>)
          {
          chomp;
          my(@content) = split('',$_);
          my($i);
          for $i (0 .. $#Schluessel)
            {
            $content{$Schluessel[$i]} = $content[$i];
            }
          }

        Grüße
          Klaus

        1. Hallo Klaus,

          vielen Dank, leider hab ich mich unklar ausgedrueckt

          while(<IN>)
            {
            chomp;
            my(@content) = split('',$_);
            my($i);
            for $i (0 .. $#content)
              {
              $content{"feld$i"} = $content[$i];
              }
            }

          ich hab ca. 120 Schlüssel/Werte ohne fortlaufende Nummerierung :-(
          die Schlüssel heissen halt z.B.
          hausnummer
          strasse
          ort
          plz
          ....
          $i = 25
          wie bringe ich nun $content[i] genau zum 25. Schlüssel
          mit der Funktion keys müsste es doch irgendwie gehen?
          die hashes werden ja nicht listenweise angesprochen, sondern zufällig

          Vielleicht hast Du nochmal einen Tip?

          günther

          1. Hallo,

            ich hab ca. 120 Schlüssel/Werte ohne fortlaufende Nummerierung :-(
            die Schlüssel heissen halt z.B.
            hausnummer
            strasse
            ort
            plz
            ....
            $i = 25
            wie bringe ich nun $content[i] genau zum 25. Schlüssel
            mit der Funktion keys müsste es doch irgendwie gehen?
            die hashes werden ja nicht listenweise angesprochen, sondern zufällig

            verstehe ich jetzt nicht. Drück dich etwas deutlicher aus.
            Gibt Beispiele an!
            Wie sehen deine Daten aus?
            Wie soll das Ergebnis aussehen?
            Welche Verarbeitung soll dazwischen passieren?
            Was willst Du eigentlich wirklich machen?

            Grüße
              Klaus

            1. Hallo Klaus,

              sorry wenn ich mich undeutlich ausgedrueckt habe, nochmal:

              gegeben:

              %hash = (
              'vorname' => 'stuff',
              'name' => 'stuff'',
              'strasse' => 'stuff'
              'plz' => 'stuff'
              'ort' => 'stuff'
              ...und noch 120 Schlüssel/Werte
              )

              gegeben:
              KlausHuberAhornstrasse 345785Testhausen..........

              Ergebnis soll sein:

              %hash = (
              'vorname' => 'Klaus',
              'name' => 'Huber'',
              'strasse' => 'Ahornstrasse 3'
              'plz' => '45785'
              'ort' => 'Testhausen'
              ...und noch 120 Schlüssel/Werte
              )

              Grüsse
              günther

              1. Hallo Klaus,

                sorry wenn ich mich undeutlich ausgedrueckt habe, nochmal:

                gegeben:

                %hash = (
                'vorname' => 'stuff',
                'name' => 'stuff'',
                'strasse' => 'stuff'
                'plz' => 'stuff'
                'ort' => 'stuff'
                ...und noch 120 Schlüssel/Werte
                )

                könnte doch auch so aussehen:
                  @Schluessel = ('vorname','name','strasse','plz','ort',...);
                oder?
                Das Problem ist, wie DU schon sagtest, daß die Schlüssel eines Arrays unsortiert sind. Irgendwo mußt Du einfach einmal festlegen, _wie_ die Reihenfolge genau aussieht, in der die Daten in der Zeile stehen. 'keys' liefert einfach nur alle keys eines heashes, aber nicht in einer bestimmten Reihenfolge. Du kannst sie dann zwar mit 'sort' wieder sortieren, aber nach welchen Kriterien ? Alphabetisch ist nicht, weil das aj sicherlich nicht Deiner Reihenfolge entspricht.
                Also bleibt Dir nichts anderes übrig, als die Reihenfolge irgendwie festzulegen.

                gegeben:
                KlausHuberAhornstrasse 345785Testhausen..........

                Hier ist die Reihenfolge festgelegt, als da muß Du Dich ja dran halten.

                Ergebnis soll sein:

                %hash = (
                'vorname' => 'Klaus',
                'name' => 'Huber'',
                'strasse' => 'Ahornstrasse 3'
                'plz' => '45785'
                'ort' => 'Testhausen'
                ...und noch 120 Schlüssel/Werte
                )

                Möglichkeit 1:
                (Mein Favorit)
                #hier wird die Reihenfolge festgelegt
                @Schluessel = ('vorname','name','strasse','plz','ort',...);

                sub einlesen
                {
                #  File aufmachen und so
                while(<IN>)
                  {
                  chomp;
                  my(@content) = split('',$_); #einlesen und aufteilen der eingabe
                  my($i);
                  my(%hash) = (); # hash leeren

                for $i (0 .. $#Schluessel) #für jeden eintrag in Schluessel
                    {
                    $hash{$Schluessel[$i]} = $content[$i]; ' Wertzuweisung
                    }
                  push @Records,{%hash}; # hier wird eine Liste von hashes angelegt
                  }

                }

                sub rausschreiben
                {
                #  File aufmachen und so
                foreach my $href (@Records)
                  {
                  for $i (0 .. $#Schluessel) #für jeden eintrag in Schluessel
                    {
                    print OUT '' if $i; # ab dem zweiten Wert ein Trennzeichen
                    print $href->{$Schluessel[$i]}
                    }
                  print "\n";
                  }

                }

                Möglichkeit 2:
                (Würde ich nicht machen, weil viel Schreibarbeit, und hoher Änderungsaufwand)

                sub einlesen
                {
                #  File aufmachen und so
                while(<IN>)
                  {
                  chomp;
                  my(@content) = split('',$_); #einlesen und aufteilen der eingabe
                  my($i);
                  my(%hash) = (); # hash leeren
                  $hash{'vorname'} =$content[0];
                  $hash{'name'} =$content[1];
                  [usw.]
                  push @Records,{%hash}; # hier wird eine Liste von hashes angelegt
                  }

                }

                sub rausschreiben
                {
                #  File aufmachen und so
                foreach my $href (@Records)
                  {
                  print $href->{'vorname'};
                  print "$href->{'name'};
                  [usw.]  
                  print "\n";
                  }

                }

                so, ich glaub' jetzt haben wir es ;-)

                Grüße
                  Klaus

                1. Hallo Klaus,

                  herzlichen Dank, ich denke so komme ich weiter.

                  könnte doch auch so aussehen:
                    @Schluessel = ('vorname','name','strasse','plz','ort',...);

                  ...aah!

                  so, ich glaub' jetzt haben wir es ;-)

                  ..puuh!

                  Grüße,
                  günther

                2. Hallo Ihr zwei!

                  Das Ihr Euch das Leben immer so kompliziert machen müßt ;-) Nun ja es heißt ja aber auch TIMTOWTDI ...

                  #hier wird die Reihenfolge festgelegt
                  @Schluessel = ('vorname','name','strasse','plz','ort',...);

                  sub einlesen
                  {
                  #  File aufmachen und so
                  while(<IN>)
                    {
                    chomp;
                    my(@content) = split('',$_); #einlesen und aufteilen der eingabe

                  Der folgende Teil geht kürzer:

                  my($i);
                    my(%hash) = (); # hash leeren

                  for $i (0 .. $#Schluessel) #für jeden eintrag in Schluessel
                      {
                      $hash{$Schluessel[$i]} = $content[$i]; ' Wertzuweisung
                      }

                  my(%hash) = (); # hash leeren kann man ja noch mal machen - einmal hätte aber auch gereicht.
                  @hash{@Schlüssel} = @content;

                  Gruß,
                     Jörk

  2. Hi,

    %hash = (
    feld1 => 'stuff',
    feld2 => 'stuff'',
    feld3 => 'stuff'

    field1 <-- inhalt1
    field2 <-- inhalt2

    Du redest von feld, stuff, field und inhalt. Was willst du jetzt eigentlich?
    Willst du den Schlüssel-Namen den Inhalt von "inhalt1" geben, und den dazugehörigen Werten die
    Zeichenfolge 'stuff', oder wie?

    Gruß,
    Slyh

    1. Halloo Sly,

      %hash = (
      feld1 => 'stuff',
      feld2 => 'stuff'',
      feld3 => 'stuff'

      field1 <-- inhalt1
      field2 <-- inhalt2

      Du redest von feld, stuff, field und inhalt. Was willst du jetzt eigentlich?
      Willst du den Schlüssel-Namen den Inhalt von "inhalt1" geben, und den dazugehörigen Werten die
      Zeichenfolge 'stuff', oder wie?

      sorry es muss feld1 statt field1 heissen.

      stimmt aber auch nicht ganz:

      stuff ist die Vorbelegung
      stuff soll durch inhalt1 ersetzt werden

      inhalt1inhalt2inhalt3

      den ersten Wert  zum ersten Schlüssel
      den zweiten Wert zum zweiten Schlüssel
      ...

      von Klaus ist schon ein Ansatz da, leider haben die Schlüssel alle
      unterschiedliche Bezeichnungen, also keine Nummern.

      Grüße
      günther