Bernhard Peissl: Array auf einen Hash zuweisen

<hi/>

Es geht um meinen Onlineshop. Die Bestell- und die persönlichen Daten werden in einer Datei gespeichert. Ich schreibe nun gerade ein Programm, mit dem man sämtliche Bestellungen abrufen kann. Da ergibt sich nun folgendes Problem:

wenn ein Kunde mehrere Produkte bestellt hat werden diese in Arrays (@produkte, @nr, @menge, ...) abgelegt. Die Arrays werden ordnungsgemäss gefüllt, aber ich würde jetzt gerne folgendes machen:

// $produkte{$name} = @produkte;
// $nr{$name} = @nr;
// $menge{$name} = @menge;
// u.s.w.

wieso geht das nicht, wie funktionierts wirklich?? Ich stell mir vor, dass es wiedermal so ein banaler Fehler ist, den ich einfach immer übersehe.

<Bernhard/>

  1. Hallo,

    hoffe mal ich hab's selber richtig kapiert. ;-)

    // $produkte{$name} = @produkte;
    // $nr{$name} = @nr;
    // $menge{$name} = @menge;
    // u.s.w.

    $produkte{$name} = [@produkte];
    oder
    $nr{$name} = @nr;

    weil nämlich :
    @array bei einer zuweisung im zusammenhang mit einem Skalar ($hash{bla} ist ein skalar) nur die Größe des Arrays zurückibt.

    Struppi.

    1. <hallo>struppi</hallo>

      Ich habs mit @array probiert, und mir im debugger angesehen:

      //$produkt{$name} = "ARRAY(0x938273c)"

      scheint also zu funktionieren. Allerdings weiss ich jetzt nicht, wie ich darauf zugreifen kann:

      // print $produkt{$name}[$i];

      eine for Schleife drüber oder wie ???

      <bernhard/>

      1. Hi,
        super !
        Das sind Konstrukte, die ich an Perl liebe (aber selber nicht immer 100% dahinter steige).

        //$produkt{$name} = "ARRAY(0x938273c)"

        logisch du übergibst eine referenz eines ARRAYS an das HASH element.

        scheint also zu funktionieren. Allerdings weiss ich jetzt nicht, wie ich darauf zugreifen kann:

        // print $produkt{$name}[$i];

        wenn mich nicht alles täuscht eher so:
        print $produkt{$name}->[$i];
        in C: $produkt{$name} ist ein Zeiger auf ein Array (ich glaub man nennt es auch anonymes Array in diesem Falle) und das macht der Fall deutlich.
        Wie gesagt bin kein Profi und diese ganzen sprachlichen wendungen wie man was nennt hab ich auch nicht drauf (Hauptsache man kann's benutzen).

        eine for Schleife drüber oder wie ???

        $i müßte dann ein Zähler sein.
        du kannst auch das Array dereferenzieren:
        @produkte = $produkt{$name};

        schlag mich wenn's nicht funktioniert, wie gesagt hab auch hin und wieder meine Probleme damit ;-)

        Struppi.

        1. <Hi/>

          Es geht nicht. Ich glaube es ist am besten, wenn ich mir überlege, wie ich das anders machen könnte :-( Die Sache ist einfach schon so verwirrend, und wenn man sich mal in seinem eigenen Code nicht mehr auskennt sollte man wohl was unternehmen! Ich werd versuchen, die Sache anders anzugehen. Werd jetzt mal ein wenig in die frische Luft gehen, und mir was zusammenreimen.

          Wenn du, oder jemand anders 'nen Vorschlag ha(s)t, wie man das besser organisieren könnte, lasst es mich bitte wissen.

          <Bernhard/>

          1. <Hi/>

            Es geht nicht. Ich glaube es ist am besten, wenn ich mir überlege, wie ich das anders machen könnte :-( Die Sache ist einfach schon so verwirrend, und wenn man sich mal in seinem eigenen Code nicht mehr auskennt sollte man wohl was unternehmen! Ich werd versuchen, die Sache anders anzugehen. Werd jetzt mal ein wenig in die frische Luft gehen, und mir was zusammenreimen.

            Wenn du, oder jemand anders 'nen Vorschlag ha(s)t, wie man das besser organisieren könnte, lasst es mich bitte wissen.

            <Bernhard/>

            hi,
            ich hab das jetzt ein wenig verfolgt. ich denke nur über die referenz kann man ein mehrdimensionales array aufbauen. eine recht ordentliche anleitung dazu gibt es bei

            http://www.phy.uni-bayreuth.de/~btpa25/perl/perl_main.html

            unter der rubrik merhdimensionale arrays. ist übrigens eine gute perl anleitung.

            gruß ingo

          2. Oweh ich glaub ich hab die Bücher nicht richtig gelesen.
            Also erklären kann ich's die nicht wirklich:

            my @a = (A..Z); # ein Array

            my %h; # Ein Hash

            $h{test} = @a; # Eine Referenz auf das Array

            $i = 0;

            foreach ( @{$h{test}} ) # so wird aus der Referent wieder ein Array
            {
            print "$i = $h{test}->[$i]\n"; # oder auch
                    print "$i = $_\n";
                    $i++;
            }

            oder

            $test = $h{test};

            dann ist:

            @$test

            auch ein Array.
            Wenn man's mal kapiert hat mit den geschweiften und eckigen Klammern, dann kann man tolle sachen mit machen.

            Rätsel um Rätsel.

            Struppi.

          3. Oweh ich glaub ich hab die Bücher nicht richtig gelesen.
            Also erklären kann ich's die nicht wirklich:

            my @a = (A..Z); # ein Array

            my %h; # Ein Hash

            $h{test} = @a; # Eine Referenz auf das Array

            $i = 0;

            foreach ( @{$h{test}} ) # so wird aus der Referent wieder ein Array
            {
            print "$i = $h{test}->[$i]\n"; # oder auch
                    print "$i = $_\n";
                    $i++;
            }

            oder

            $test = $h{test};

            dann ist:

            @$test

            auch ein Array.
            Wenn man's mal kapiert hat mit den geschweiften und eckigen Klammern, dann kann man tolle sachen mit machen.

            Rätsel um Rätsel.

            Struppi.

  2. Hi,

    sehe ich es richtig, daß du ein ganzes Array in ein Hash-Element ($produkte{$name}) packen willst?

    Tobias

    1. Hallo Tobias!

      Genau, gibts eine elegantere Lösung ?? Ich weiss nämlich nicht, ob ich mich bei dem ganzen Herumfuhrwerken in 2 Monaten auch noch auskenne :-(

      Aber vorerst würde es mir reichen, wenn mir jemand sagen könnte, wie die Daten dann im Hash liegen, z.B.:

      $produkte{$name}[0] = "1.Produkt"
      $produkte{$name}[1] = "2.Produkt"
      ....

      dann würde mir das schon sehr viel weiter helfen. Jedoch bin ich auch für andere Vorschläge offen !

      <Bernhard/>

  3. Hallo !

    Falls ich jetzt Müll poste, Verzeihung! Die gestrige Nacht war wieder einmal sehr kurz.

    Irgendwie sehe ich hier einen merkwüridgen Ansatz.

    Soweit ich deinen Ansatz verstanden habe, liest du deine Datentabelle SPALTENweise aus und nicht ZEILENweise.

    Kommt mir persönlich sehr komisch vor.

    Gruß,
    kerki

    1. <Hi/>

      Ich bin kein Datenbankler, aber ich ich verwende den Namen des Kunden als Schlüssel. Anhand des Namens möchte ich auf die bestellten Produkte zugreifen.

      Aber was schlägst du vor??

      <Bernhard/>

      1. Hallo !

        Ich bin kein Datenbankler, aber ich ich verwende den Namen des Kunden als Schlüssel.

        SCNR: ... und öffnest dann damit dem Chaos Tür und Tor.

        Aber ernsthaft, das könnte klappen, wenn jeder einen so einzigartigen Namen hat wie ich, aber es gibt zahlreiche Helmut Schmidt(s). Nicht umsonst gibt es so etwas wie Kundennummern.

        Aber was schlägst du vor??

        Zunächst mal etwas Grundlagenkenntnis im Hinblick auf relationale Datenbanken aneignen und dann vielleicht auf ein paar vorgefertigte Shopsysteme zurückgreifen oder davon lernen/abgucken,

        ... oder, wenn es wirklich professioneller E-Commerce werden soll (und das in näherer Zukunft), vielleicht doch jemanden fragen, der sich damit auskennt?

        Ich selbst habe über 15 Jahre PC-Erfahrung und Datenbanken waren immer meine Leidenschaft. Einiges Brauchbares habe ich auch schon im Beruf einsetzen können, aber wenn es um sensible Daten geht und zudem vielleicht auch noch um viel Geld, lasse ich eigentlich lieber die Finger davon.

        'Webdesign', oder wie man es immer nennen möchte, ist ein dermaßen weitumfassendes Feld, dass man sich IMHO keinen Zacken abbricht, einzugestehen, dass man keine eierlegende Wollmilchsau ist.

        In diesem Sinne ...

        Gruß,
        kerki

        1. <hallo/>

          Aber ernsthaft, das könnte klappen, wenn jeder einen so einzigartigen Namen hat wie ich, aber es gibt zahlreiche Helmut Schmidt(s). Nicht umsonst gibt es so etwas wie Kundennummern.

          Genau das werd ich als nächstes probieren, aber ich müsste mir die Nummern erst selbst generieren, das ist der Haken daran.

          Aber was schlägst du vor??

          Zunächst mal etwas Grundlagenkenntnis im Hinblick auf relationale Datenbanken aneignen und dann vielleicht auf ein paar vorgefertigte Shopsysteme zurückgreifen oder davon lernen/abgucken,

          Hab ich vor, versprochen, bald ...

          ... oder, wenn es wirklich professioneller E-Commerce werden soll (und das in näherer Zukunft), vielleicht doch jemanden fragen, der sich damit auskennt?

          Es soll kein professioneller E-commerce werden, keine Sorge, aber wen Fragen, einstweilen begnüge ich mich mit euch ;-)

          'Webdesign', oder wie man es immer nennen möchte, ist ein dermaßen weitumfassendes Feld, dass man sich IMHO keinen Zacken abbricht, einzugestehen, dass man keine eierlegende Wollmilchsau ist.

          <grins>Ich muss glaub ich mal damit anfangen eure Sprüchen mitzuschreiben, die sind echt der Oberhammer </gins>

          <ernst>Es gibt aber doch wirklich soviel Intersanntes. Und das blöde ist, alles hängt irgendwie zusammen. Man müsste sich überall auskennen, und ich bin doch erst am Anfang :-( Aber ich probiere andauernd Sachen aus, wo ich dann an den Punkt komme wie jetzt, an dem ich schon wieder was neues lernen sollte, obwohl ich mich noch nicht mal so richtig mit dem anderen beschäftigt habe. Ein Teufelkreis.</ernst>

          <grüsse>
          bernhard
          </grüsse>

          1. Hallo Bernhard !

            Genau das werd ich als nächstes probieren, aber ich müsste mir die Nummern erst selbst generieren, das ist der Haken daran.

            ... obwohl das noch gar nicht mal so schwer ist. DurchnumMerien, zählen, Summe als Zahl irgendwo abspeichern. Wenn Neukunde kommt, Zahl auslesen und diesem Kunden zuordnen. Zahl+1 wieder abspeichern usw...

            Wenn du allerdings die technischen Möglichkeiten hast, eine SQL-DB einzusetzen, ist alles _viel_ einfacher und schneller.

            MySQL kann ich in diesem Zusammenhang für Einsteiger (und nicht nur für die) sehr empfehlen. Zum einen läuft diese Software bei vielen großen Providern und zum anderen gibts diesen Server gratis, so dass man alles am heimischen PC ausprobieren kann.

            Ach ja, und MS-Access natürlich auch. Haben ja viele, wissen nur nichts damit anzufangen.

            Es gibt dann auch schon ein fertiges Shopsystem auf (My)SQL-Basis in PHP, namens Caupo-Shop http://www.caupo.de/soft/ von dem justamente eine Update-Version 1.12 erschienen ist. Das kostest ebenfalls überhaupt nichts, und ein Supportforum (nicht ganz so gut wie hier, aber fast!) gibt es auch noch dazu. Wirklich empfehlenswert.

            Schau's dir mal an ! Ein Demoshop ist auch dabei (allerdings kein guter). Und nicht verwirren lassen: Die im Caupo-Guide aufgeführten Shops sind nicht zwingend Caupo-Shops.

            <ernst>Es gibt aber doch wirklich soviel Intersanntes. Und das blöde ist, alles hängt irgendwie zusammen. Man müsste sich überall auskennen, und ich bin doch erst am Anfang :-( Aber ich probiere andauernd Sachen aus, wo ich dann an den Punkt komme wie jetzt, an dem ich schon wieder was neues lernen sollte, obwohl ich mich noch nicht mal so richtig mit dem anderen beschäftigt habe. Ein Teufelkreis.</ernst>

            Mein Rat: Mut zur Lücke !

            Ich z.B. habe mich noch nie ernsthaft mit Javascript beschäftigt, nicht mit Flash und anderem Schickimicki, sondern beschränke mit zunächst einmal auf HTML und serverseitige Programme zur Erzeugung davon.

            Das kann aber natürlich jeder so handhaben wie er will. Ich bin aber froh, dass ich mich noch nie gefragt habe, wie ich per JS 2 Frames gleichzeitig ändern kann. :-)

            Gruß,
            kerki

            1. <hallo>
              kerki
              </hallo>

              Genau das werd ich als nächstes probieren, aber ich müsste mir die Nummern erst selbst generieren, das ist der Haken daran.

              ... obwohl das noch gar nicht mal so schwer ist. DurchnumMerien, zählen, Summe als Zahl irgendwo abspeichern. Wenn Neukunde kommt, Zahl auslesen und diesem Kunden zuordnen. Zahl+1 wieder abspeichern usw...

              Danke, werd ich machen. Das blöde daran ist nur in der Firmendatenbank sind die Nummern schon alle vergeben, und wenn ich jetzt andere Nummern vergebe, habe ich spätestens dann, wenn ich PHP kann, und ich die Datenbank ans Internet hänge, Probleme, dass ich jedem die richtige Nummer zuweisen muss ... aber erst mal machen und dann weitersehen.

              Wenn du allerdings die technischen Möglichkeiten hast, eine SQL-DB einzusetzen, ist alles _viel_ einfacher und schneller.

              Hab ich nicht, ausserdem wär das wieder etwas, das ich erst mal lernen müsste :-( Aber keine Frage, ich werde mich sobald wie möglich damit beschäftigen! Ausserdem will ichs selbst mal probieren, muss ich doch auch so hinkriegen, kann doch nicht so schwer sein!

              Es gibt dann auch schon ein fertiges Shopsystem auf (My)SQL-Basis in PHP, namens Caupo-Shop http://www.caupo.de/soft/ von dem justamente eine Update-Version 1.12 erschienen ist. Das kostest ebenfalls überhaupt nichts, und ein Supportforum (nicht ganz so gut wie hier, aber fast!) gibt es auch noch dazu. Wirklich empfehlenswert.

              Habs mir jedenfalls mal gesichert. anfangen kann ich zwar noch nix damit, aber die Zeit wird kommen, wo ich php und SQL lernen werde, und damm werde ich ihn mir mal ordentlich zu Gemüte führen !

              Das kann aber natürlich jeder so handhaben wie er will. Ich bin aber froh, dass ich mich noch nie gefragt habe, wie ich per JS 2 Frames gleichzeitig ändern kann. :-)

              Das ist ganz leicht, wenn du willst kann ichs dir erklären ;-)

              <tshüss>
              Bernhard
              </tschüss>

              1. Hallo

                Danke, werd ich machen. Das blöde daran ist nur in der Firmendatenbank sind die Nummern schon alle vergeben, und wenn ich jetzt andere Nummern vergebe, habe ich spätestens dann, wenn ich PHP kann, und ich die Datenbank ans Internet hänge, Probleme, dass ich jedem die richtige Nummer zuweisen muss ... aber erst mal machen und dann weitersehen.

                Das mit den Nummern ist dadurch nicht komplizierter. z.B.: Die Altkunden behalten ihre Nummern, und Neukunden, die übers Netz kommen, erhalten automatisch fortlaufende Nummern zugewiesen, die in einem Zahlenbereich oberhalb jenes für Altkunden liegen.
                Bsp.: Altkunden haben Nummern zwischen 10.000-99.999
                      Der erste Neukunde bekommt Nr. 100.000

                Und PHP MUSS für SQL NICHT sein. Das geht mit Perl m.E. genauso gut und ist - vor allem wenn man Perl schon kennt - genauso einfach.

                Das war wohl etwas aus meinem Posting so nicht verständlich.

                Eine mit dem Caupo-Shop vergleichbare Lösung in Perl habe ich selbst noch nicht gefunden. Es gibt da zwar 'Minivend', aber dies ist AFAIK deutlich komplexer und schwieriger für Einsteiger.

                (SQL-SERVER) Hab ich nicht,

                Eigener Server: installieren ! kost nix !
                Provider: (Tarif-)Wechsel ?

                »»  ausserdem wär das wieder etwas, das ich erst mal lernen müsste :-( Aber keine Frage, ich werde mich sobald wie möglich damit beschäftigen!

                SQL selbst ist wirklich nicht schwer !

                Schwer ist der vernünftige Entwurf einer DB und daran kommst du m.E. ohnehin nicht vorbei. (Ausser durch z.B. den Caupo-Shop)

                Ausserdem will ichs selbst mal probieren, muss ich doch auch so hinkriegen, kann doch nicht so schwer sein!

                Dies ist, verglichen mit SQL-Lösungen, hinsichtlich der Funktionalität schwer und in Bezug auf die Performance unmöglich. Ich sehe aber YourSQL V.10 mit Spannung entgegen. ;-)

                Habs mir jedenfalls mal gesichert. anfangen kann ich zwar noch nix damit, aber die Zeit wird kommen, wo ich php und SQL lernen werde, und damm werde ich ihn mir mal ordentlich zu Gemüte führen !

                Um mit dem Caupo-Shop etwas _anfangen_ zu können, bedarf es (fast) keiner php- und SQL-Kenntnisse, und PHP und Perl sind SO unterschiedlich nun auch wieder nicht.

                Ansonsten gilt natürlich weiterhin:

                Das kann aber natürlich jeder so handhaben wie er will.

                Das ist ganz leicht, wenn du willst kann ichs dir erklären ;-)

                KEIN Bedarf, Danke! ;-)

                Gruß,
                kerki

                1. <Hallo />

                  Das mit den Nummern ist dadurch nicht komplizierter. z.B.: Die Altkunden behalten ihre Nummern, und Neukunden, die übers Netz kommen, erhalten automatisch fortlaufende Nummern zugewiesen, die in einem Zahlenbereich oberhalb jenes für Altkunden liegen.
                  Bsp.: Altkunden haben Nummern zwischen 10.000-99.999
                        Der erste Neukunde bekommt Nr. 100.000

                  Das blöde daran ist, dass zu ca. 80-90% die Altkunden über Internet bestellen. Die Firma bietet Seminare für Wirtschaftstreuhänder an, die auf unserer Homepage sich für Kurse anmelden und Skripten kaufen können. In der Firmen-Datenbank haben die schon alle Nummern, und ich kann jetzt nicht einfach hergehen und für die im Internet nochmal neue Nummern vergeben. Aber was solls, ich kenn mich ja ohnehin noch viel zuwenig aus. Ich weiss ja nichtmal, wie ich die Daten vom Formular auf der Homepage (halbwegs sicher) in die Datenbank auf unserem Firmenserver bringen soll. SSL?

                  Und PHP MUSS für SQL NICHT sein. Das geht mit Perl m.E. genauso gut und ist - vor allem wenn man Perl schon kennt - genauso einfach.

                  ich schätz mal: nachzulesen in perldoc ??

                  Das war wohl etwas aus meinem Posting so nicht verständlich.

                  Eine mit dem Caupo-Shop vergleichbare Lösung in Perl habe ich selbst noch nicht gefunden. Es gibt da zwar 'Minivend', aber dies ist AFAIK deutlich komplexer und schwieriger für Einsteiger.

                  (SQL-SERVER) Hab ich nicht,

                  Eigener Server: installieren ! kost nix !
                  Provider: (Tarif-)Wechsel ?

                  »»  ausserdem wär das wieder etwas, das ich erst mal lernen müsste :-( Aber keine Frage, ich werde mich sobald wie möglich damit beschäftigen!

                  SQL selbst ist wirklich nicht schwer !

                  Schwer ist der vernünftige Entwurf einer DB und daran kommst du m.E. ohnehin nicht vorbei. (Ausser durch z.B. den Caupo-Shop)

                  Das hab ich auch schon von mehreren gehört, dass SQL an sich nicht so schwer sein soll. Ich habe auch schon mal einen kleinen Blick reingeworfen, und muss sagen, das gefällt mir sehr. Da kann man irre viel mit machen.

                  Grüsse,
                  <bernhard />

                  1. Hallo!

                    Ich weiss ja nichtmal, wie ich die Daten vom Formular auf der Homepage (halbwegs sicher) in die Datenbank auf unserem Firmenserver bringen soll. SSL?

                    Leider bin ich genau in diesem Punkt auch noch nicht zu einer Lösung gelangt. :-(

                    Und PHP MUSS für SQL NICHT sein. Das geht mit Perl m.E. genauso gut und ist - vor allem wenn man Perl schon kennt - genauso einfach.

                    ich schätz mal: nachzulesen in perldoc ??

                    Dazu braucht man 2 Module (DBI und DBD::MySQL) und da sind dann gute Dokus dabei.

                    Das hab ich auch schon von mehreren gehört, dass SQL an sich nicht so schwer sein soll. Ich habe auch schon mal einen kleinen Blick reingeworfen, und muss sagen, das gefällt mir sehr. Da kann man irre viel mit machen.

                    Irre viel und das irre schnell ! ;-)

                    Gruß,
                    kerki

                    1. <hallo />

                      Wir sprengen schön langsam meinen Monitor. Ich fahre mit 800x600 Unser kleines Duett macht ihm ganz schön schwer zu schaffen ;-)

                      Ich weiss ja nichtmal, wie ich die Daten vom Formular auf der Homepage (halbwegs sicher) in die Datenbank auf unserem Firmenserver bringen soll. SSL?

                      Leider bin ich genau in diesem Punkt auch noch nicht zu einer Lösung gelangt. :-(

                      Es gibt hier also doch noch Menschen. Ihr seid ja gar nicht alle Götter. Schön zu hören, dass sich einer von euch mal nicht überall auskennt. Da besteht für mich also doch noch Hoffnung ;-)

                      ich schätz mal: nachzulesen in perldoc ??

                      Dazu braucht man 2 Module (DBI und DBD::MySQL) und da sind dann gute Dokus dabei.

                      Danke für den Tip !

                      Ach ja, noch was: Sagt dir zufällig _Centura-SQL_ irgend etwas. Mit dieser Version arbeiten wir nämlich in unserer Firma! Kann man da irgendwo Informationen dazu bekommen ? Ich weiss nur, dass es PHP NICHT unterstützt. Heisst das, dass man von PHP aus nicht darauf zugreifen kann, oder nur dass keine vorgefertigten Zusatzroutinen oder so ähnliches eingebaut sind, bzw gibts ein DBD::CenturaSQL in PERL ?

                      schöne Grüsse,
                      Bernhard

                      PS: Isses bei Euch auch so heiss ??? In .at derzeit 38°C (im Schatten!!!) <schwitz />

  4. Hallo Bernhard,

    wenn ein Kunde mehrere Produkte bestellt hat werden diese in Arrays (@produkte, @nr, @menge, ...) abgelegt. Die Arrays werden ordnungsgemäss gefüllt, aber ich würde jetzt gerne folgendes machen:

    // $produkte{$name} = @produkte;
    // $nr{$name} = @nr;
    // $menge{$name} = @menge;
    // u.s.w.

    ob das Ganze Sinn und Zweck hat musst Du entscheiden, so gehts zumindest mit Perl. Vielleicht kannst Du ja damit etwas anfangen:

    #!perl -w

    use strict;
    my %produkte;

    my $name='mueller';
    my @produkte = qw/pc monitor maus/;
    $produkte{$name} = [@produkte];       #referenz auf ary in hash

    $name='meier';
    @produkte = qw/drucker tastatur/;
    $produkte{$name} = [@produkte];       #referenz auf ary in hash

    #Ausgabe
    foreach my $name (keys %produkte) {   #alle kunden durchgehen
        print "$name:\n";
        foreach my $produkt ( @{ $produkte{$name} } ) { # ary dereferenzieren
            print "$produkt\n";                         # und Produkte ausgeben
        }    
    }

    Weiteres zu diesem Thema findest Du unter:

    perldoc perlref
    perldoc perlreftut
    perldoc perllol

    <Bernhard/>

    Gruss
       Kai

  5. Hallo Bernhard!

    Es geht um meinen Onlineshop. Die Bestell- und die persönlichen Daten werden in einer Datei gespeichert. Ich schreibe nun gerade ein Programm, mit dem man sämtliche Bestellungen abrufen kann. Da ergibt sich nun folgendes Problem:

    wenn ein Kunde mehrere Produkte bestellt hat werden diese in Arrays (@produkte, @nr, @menge, ...) abgelegt. Die Arrays werden ordnungsgemäss gefüllt, aber ich würde jetzt gerne folgendes machen:

    // $produkte{$name} = @produkte;
    // $nr{$name} = @nr;
    // $menge{$name} = @menge;
    // u.s.w.

    wieso geht das nicht, wie funktionierts wirklich?? Ich stell mir vor, dass es wiedermal so ein banaler Fehler ist, den ich einfach immer übersehe.

    Du solltest wohl Deinen Ansatz etwas ummodeln. Z.B. so:
    Ein Hash %bestellungen mit den namen als Key. Heraus kommt ein Array sämtlicher Bestellungen. Jede einzelne Bestellung ist ein Hash mit je einem Eintrage pro Produkt, Nr und Menge.

    Zugriff dann wie folgt:
    foreach my $bestellung (@{$bestellungen{$name}}) {
        print "Produkt: $bestellung->{'produkt'}\n";
        print "Nr: $bestellung->{'nr'}\n";
        print "Menge: $bestellung->{'menge'}\n";
    }

    Das ganze aus Deinen "Spaltenarrays" zu erzeugen ist etwas aufwendiger. Sinnvoller ist ist wohl beim einlesen der Datensätze die Daten gleich richtig zu verpacken:
    push(@{$bestellungen{$name}}, {'produkt' => $produkt, 'nr' => $nr, 'menge' => $menge});

    Viel Spass,
       Jörk

    1. Hallo,

      Du solltest wohl Deinen Ansatz etwas ummodeln. Z.B. so:
      Ein Hash %bestellungen mit den namen als Key. Heraus kommt ein Array sämtlicher Bestellungen. Jede einzelne Bestellung ist ein Hash mit je einem Eintrage pro Produkt, Nr und Menge.

      Ich weiss nicht, ob ich das richtig geschnallt hab: Wenn jetzt ein Kunde 10 Produkte bestellt, muss ich zehnmal die ganzen Daten zur Person mitspeichern, aber genau das wollte ich ja verhindern. Sowas ähnliches hab ich mir auch schon überlegt.

      Zugriff dann wie folgt:
      foreach my $bestellung (@{$bestellungen{$name}}) {
          print "Produkt: $bestellung->{'produkt'}\n";
          print "Nr: $bestellung->{'nr'}\n";
          print "Menge: $bestellung->{'menge'}\n";
      }

      puuhhh, ... starker Toback !!

      Das ganze aus Deinen "Spaltenarrays" zu erzeugen ist etwas aufwendiger. Sinnvoller ist ist wohl beim einlesen der Datensätze die Daten gleich richtig zu verpacken:
      push(@{$bestellungen{$name}}, {'produkt' => $produkt, 'nr' => $nr, 'menge' => $menge});

      <uff>Also das sieht so kompliziert aus, ich fürchte dafür hab ich zu wenig Ahnung von PERL und Hashes.</uff>

      Trotzdem danke,
      Bernhard

  6. hi!

    // $produkte{$name} = @produkte;
    // $nr{$name} = @nr;
    // $menge{$name} = @menge;
    // u.s.w.
    wieso geht das nicht, wie funktionierts wirklich??

    Folgendes erstellt eine Referenz auf das Array @produkte:
      $referenz = @produkte;
    Diese Referenz ist wieder ein Skalar, kann also leicht in einer
    anderen Liste oder einem Hash gespeichert werden:
      $hash{$key} = $referenz;
    Oder direkt:
      $hash{$key} = @produkte;

    Um die Referenz wieder zu de-referenzieren, musst du einfach vor das
    $-Zeichen des Skalars $referenz schreiben, um was für einen Datentyp
    es sich handelt:
      $referenz = @produkte;
      @produktliste = @{ $referenz };
    Perl weiß dann, dass $referenz eine Referenz auf eine Liste ist. Es
    speichert dann die referenzierte Liste in @produktliste.

    Gleiches ist mit Hashes möglich:
      $referenz = %hash;
      %newhash = %{ $referenz };

    Geht natürlich auch mit Skalaren, wobei es da etwas weniger sinnvoll
    ist.

    Jörk's Code ist lediglich eine andere Methode, auf die gespeicherten
    Referenzen zuzugreifen. Wobei ich mich damit nicht so ganz auskenne,
    aber vermutlich funktioniert das etwa so:
      @liste = ("eins", "zwei", "drei");
      $liste_ref = @liste;
      $skalar = $liste_ref;
      print $skalar->[0];  # -> eins
      print $skalar->[1];  # -> zwei
      ...

    Analoges bei Hashes:
      %hash = ("eins" => "elf", "zwei" => "zwölf");
      $hash_ref = %hash;
      $skalar = $hash_ref;
      print $skalar->{'eins'};  # -> elf
      print $skalar->{'zwei'};  # -> zwölf
      ...

    Ich hoffe, das war klar genug ausgedrückt. Weitere Infos gibt's mit:
      perldoc perlref

    bye, Frank!