Jack Gautier: HASH

Hallo Leute,

mein Problem mit assoziativen Arrays ist folgendes:
In eine Datei werden neue Adressen aufgenommen. Über den Schlüssel sollen die Werte gefunden werden.
Das hatte ich mit einen ass. Arrays vor weil das schneller gehen soll als mit einer Liste.

Die Datei wird geöffnet und der DATEIHANDLER dem Array %ALLCARDS zugewiesen.
Ist das Möglich?

open(CARDS, "<$datei.txt");
  flock(CARDS,2) ;
  %ALLCARDS = <CARDS>;
  flock(CARDS,8) ;
  close (CARDS) ;

...dem Array ein neuer Wert hinzufügen ...
Funktioniert das auch wenn die Datei noch nicht existiert also
%ALLCARDS noch nicht gibt?

%ALLCARDS{12345}= ['Vorname','Name'];

das erweiterte Array nun in die Datei schreiben.

open(CARDS, ">$datei.txt");
  flock(CARDS,2) ;
  print CARDS %ALLCARDS;
  flock(CARDS,8) ;
  close (CARDS) ;

In einem zweiten Skript sollte das Paar so gefunden werden.

open(CARDS, "<$datei.txt");
  flock(CARDS,2) ;
  %ALLCARDS = <CARDS>;
  flock(CARDS,8) ;
  close (CARDS) ;

@Tools = @{$ALLCARDS{'12345'}};

Wie Ihr seht, habe ich das mit den HASHS noch nicht gerafft.
Ist das so überhaupt der richtige Weg?

Ich würd mich freuen wenn jemand LUST hat, mir mit ein paar Zeilen zu erklären wie aus Dateien HASHS erzeugt werden. In einigen Büchern und im Forum habe ich nicht das Richtige darüber gefunden...damit ich es verstanden hätte.

Vielen Dank
Jack Gautier

  1. hi!

    mein Problem mit assoziativen Arrays ist folgendes:
    In eine Datei werden neue Adressen aufgenommen. Über den Schlüssel sollen die Werte gefunden werden.
    Das hatte ich mit einen ass. Arrays vor weil das schneller gehen soll als mit einer Liste.

    [...]

    Dein Problem habe ich leider nicht verstanden. Aber hier mal ein paar Gedanken zum Umgang mit Hashs:

    Der - für den jeweiligen Programmierer entscheidende - Unterschied zwischen Arrays und Hashs ("assoz. Arrays") ist, wie man auf die enthaltenen Elemente zugreift. Bei Arrays geschieht dies einfach über den Index, eine Zahl von 0 bis [Größe-1]. Bei Hashs dagegen greift man mit einem Schlüssel auf ein Element zu, der aus einer beliebigen Zeichenfolge bestehen kann.

    In Perl:

    • Arrays:
           @array = ("eins", "zwei", "drei", "vier");
           $array[0] = "eins"; $zwei = $array[1];
    • Hashs:
           %hash = ("Müller" -> "Hans", "Schmidt" -> "Otto");
           $hash{'Müller'} = "Hans"; $otto = $hash{'Schmidt'};

    Man verwendet also Arrays, wenn man eine sortierte oder fortlaufende Liste hat, Hashs dagegen, wenn die Liste nicht sortiert sein muss und wenn man günstigerweise einen Schlüssel hat, anhand dessen man die Werte auslesen will.

    bye, Frank!

    1. Hallo Frank!

      Dein Problem habe ich leider nicht verstanden. Aber hier mal ein paar Gedanken zum Umgang mit Hashs:

      Dank für Dein Posting.

      Mein Problem ist, die Zuweisung der Daten aus einer Datei.

      open(CARDS, "<$datei.txt");
        flock(CARDS,2) ;
        %ALLCARDS = <CARDS>;
        flock(CARDS,8) ;
        close (CARDS) ;

      Kann man so dem HASH %ALLCARDS den Inhalt der Datei datei.txt zuweisen.
      Was ist wenn die Datei noch nicht existiert und man
      %ALLCARDS einen neuen Wert zufügen möchte.

      %ALLCARDS{"Meier"} = "Hans";

      Bei meinen beschrieben Versuchen kam es immer zu einem Konflikt.

      Servus Jörg

      1. Mein Problem ist, die Zuweisung der Daten aus einer Datei.
          open(CARDS, "<$datei.txt");
          flock(CARDS,2) ;
          %ALLCARDS = <CARDS>;
          flock(CARDS,8) ;
          close (CARDS) ;
        Kann man so dem HASH %ALLCARDS den Inhalt der Datei datei.txt zuweisen.

        Ich fürchte, Du mußt jede einzelne Zeile erst mal in Schlüsselteil und Wert-Teil zerlegen - wie das geht, hängt vom Aufbau Deiner Datei ab - und dann die einzelnen Zuweisungen an den Hash machen.

        Was ist wenn die Datei noch nicht existiert und man
        %ALLCARDS einen neuen Wert zufügen möchte.

        Welchen Sinn soll das machen? Wenn die Datei nicht existiert, welchen Inhalt brauchst Du dann im Hash?

        Bei meinen beschrieben Versuchen kam es immer zu einem Konflikt.

        Was ist ein "Konflikt", und zwischen wem?

        1. Ich fürchte, Du mußt jede einzelne Zeile erst mal in Schlüsselteil und Wert-Teil zerlegen - wie das geht, hängt vom Aufbau Deiner Datei ab - und dann die einzelnen Zuweisungen an den Hash machen.

          So langsam geht mir ein Licht auf.
          Der Schlüssel und der Wert sind durch ein = getrennt.

          %Daten =()
            open(CARDS, ">$datei.txt");
            while = (<CARDS>){
            $TheDaten = $_; chomp($TheDaten)
            ($Key,$Werte) = split(/=/, $TheDaten);

          So jetzt währen die Daten gesplittet. Wann sind die Daten im HASH das man mit

          @tools =@{$Daten{'$Key'}
            
          einen bestimmten Wert aus der Datenbank lesen kann?

          Bei meinen beschrieben Versuchen kam es immer zu einem Konflikt.

          Was ist ein "Konflikt", und zwischen wem?

          Manchmal kann ich mich nicht richtig ausdrücken. Mit Konflikt war gemeint das Programm läuft nicht mehr auf dem Server.

          Jörg

          1. Hi,

            die Initiative für ein sauberes Perl [tm] sagt dazu:

            #!/usr/bin/perl -w
            use strict;

            %Daten =()

            my %daten;

            open(CARDS, ">$datei.txt");

            Zum Schreiben öffnen?!

            open(CARDS,"$datei.txt") or die "Kann $datei.text nicht oeffnen: $!";

            while = (<CARDS>){

            while (<CARDS>) {

            $TheDaten = $_; chomp($TheDaten)

            chomp;

            ($Key,$Werte) = split(/=/, $TheDaten);

            my ($key, $wert) = split /=/;
            $daten{$key} = $wert;
            }

            So jetzt währen die Daten gesplittet. Wann sind die Daten im HASH das man mit

            @tools =@{$Daten{'$Key'}
              
            einen bestimmten Wert aus der Datenbank lesen kann?

            Wenn Du sie reinschreibst, was Du offenbar vergessen hast. Aber warum willst Du so verquer auf die Daten zugreifen? Meinst Du wirklich das damit, was Du sagst?

            Cheatah