Stephan: dynamisches initialisieren von mehrdimensionalen Hashes

Hallo!

Ich würde gerne einen zweidimensionalen Hash initialisiern um ihn später füllen zu können. Die Keys des äußeren Hashs kommen dynamisch aus einer Liste (@list).
Folgendes funktioniet nicht, da dadurch alle Keys auf die gleiche Refernz zeigen:

----------------------------
my @list;
my %domains;
my %addresses;

foreach (@list){
 $domains{$_} = %addresses;
}
----------------------------

Was müsste ich machen um die Keys alle mit eigenen leeren Hashs zu verknüpfen?

Danke für Eure Hilfe!
Stephan

  1. Ich würde gerne einen zweidimensionalen Hash initialisiern um ihn später füllen zu können. Die Keys des äußeren Hashs kommen dynamisch aus einer Liste (@list).
    Folgendes funktioniet nicht, da dadurch alle Keys auf die gleiche Refernz zeigen:


    my @list;
    my %domains;
    my %addresses;

    Den brauchst du nicht.

    foreach (@list){
    $domains{$_} = %addresses;

    so geht's:$domains{$_} = {};

    Struppi.

    1. Danke für die Antwort! Leider klappt das noch nicht so richtig wie ich will. Vielleicht mach ich noch was falsch. Nach der initialisierung mach ich folgendes:

      ----------------------------
      my $ref;
      $ref = $domains{"test.de"};
      %addresses = %{$ref};

      $addresses{"juhu@test.de"} = 3;

      print(keys(%addresses));
      print("\n");
      print($ref . "\n");

      $ref = $domains{"test.de"};
      my %addresses2 = %{$ref};
      print(keys(%addresses2));
      print("\n");
      print($ref . "\n");
      ----------------------------

      Die Ausgabe ist jedoch die folgende:

      ----------------------------
      juhu@test.de
      HASH(0x19620b0)

      HASH(0x19620b0)
      ----------------------------

      Aus irgendeinem Grund ist der Hash beim zweiten Aufruf also leer, ! Kann jemand meinen Denkfehler erkennen?

      Danke für Eure Hilfe!
      Stephan

      Ich würde gerne einen zweidimensionalen Hash initialisiern um ihn später füllen zu können. Die Keys des äußeren Hashs kommen dynamisch aus einer Liste (@list).
      Folgendes funktioniet nicht, da dadurch alle Keys auf die gleiche Refernz zeigen:


      my @list;
      my %domains;
      my %addresses;

      Den brauchst du nicht.

      foreach (@list){
      $domains{$_} = %addresses;

      so geht's:$domains{$_} = {};

      Struppi.

      1. Danke für die Antwort! Leider klappt das noch nicht so richtig wie ich will. Vielleicht mach ich noch was falsch. Nach der initialisierung mach ich folgendes:

        Mir ist nicht klar was du vorhast, du kannst aber jeder zeit mit Data::Dumper die Struktur deiner Daten überprüfen.

        Struppi.

        Ach, und Bitte lass das stehen worauf du antworten möchtest und lösch den Rest aus der vorherigen Nachricht.

        Struppi.

        1. OK, ich dachte es wäre klar, wo das Problem liegt, sorry...
          Also. In Zeile 2 und 8 (s.u.) hole ich jeweils die Referenz auf den Hash zum Key "test.de". Die Ausgaben aus den Zeilen 7 und 12 sollen zeigen, dass die Referenzen beide Male auf den gleichen Hash zeigen (da gleich Adresse ausgegeben wird).
          In Zeile 4 fülle ich den mit dem key "test.de" verknüpften Hash dort mit einem Wertepaar. Die Ausgabe in Zeile 5 belegt dies.
          Das Problem ist nun, dass wenn ich den Hash für "test.de" erneut hole (Zeile 8; Referenz verweis ja auf die gleiche Adresse, s.o.) und mir erneut die Keys anzeigen lasse (Zeile 10), die Keyliste (und somit der ganze Hash) nun leer ist! Eigentlich sollte doch der in Zeile 4 gemachte Eintrag dort immer noch drin sein, oder nicht?

          Hab ich da was grundlegendes übersehen?

          ----------------------------
          1 my $ref;
          2 $ref = $domains{"test.de"};
          3 %addresses = %{$ref};

          4 $addresses{"juhu@test.de"} = 3;

          5 print(keys(%addresses));
          6 print("\n");
          7 print($ref . "\n");

          8 $ref = $domains{"test.de"};
          9 my %addresses2 = %{$ref};
          10 print(keys(%addresses2));
          11 print("\n");
          12 print($ref . "\n");
          ----------------------------

          Danke nochmal!

          Stephan

          1. Also. In Zeile 2 und 8 (s.u.) hole ich jeweils die Referenz auf den Hash zum Key "test.de".

            Ist das so? Ich sehe keine Referenz, tut mir leid es bringt nichts wenn du uns nur Ausschnitte aus dem Code zeigst ohne das wir deine Datenstruktur (die du dir wie schon gesagt mit Data::Dumper angucken kannst) kennen, läßt sich dir nicht helfen.

            Die Ausgaben aus den Zeilen 7 und 12 sollen zeigen, dass die Referenzen beide Male auf den gleichen Hash zeigen (da gleich Adresse ausgegeben wird).

            Exakt das macht dein Code.

            In Zeile 4 fülle ich den mit dem key "test.de" verknüpften Hash dort mit einem Wertepaar. Die Ausgabe in Zeile 5 belegt dies.
            4 $addresses{"juhu@test.de"} = 3;

            5 print(keys(%addresses));

            Du weist dem Schlüssel eine Zahl zu und läßt dir die diese Liste ausgeben.

            Hab ich da was grundlegendes übersehen?

            ich vermute eher was grundlegendes nicht verstanden. Aber mir ist nachwievor nicht klar was du willst.

            Grundlegend solltest du diese Seiten kennen und lesen:
            http://perldoc.perl.org/perlref.html
            http://perldoc.perl.org/perldsc.html

            Struppi.

            1. Ja, scheinbar habe ich ein Grundlagenproblem. Allerdings ist aus der Doku nicht ersichtlich WO mein Fehler liegt...

              Hier mal ein komplettes Programm um mein Problem zu verdeutlichen (es soll KEINEN sinnvollen Zweck erfüllen, sondern einfach nur das Problem zeigen!)

              ---------------------
              my %outhash;
              my %inhash;

              $outhash{"test"} = {"ich" => "du"};

              %inhash = %{$outhash{"test"}};
              print %inhash; #Ausgabe "ichdu"
              print "\n";
              $inhash{"er"} = "sie";
              print %inhash; #Ausgabe "ichduersie"
              print "\n";

              print %{$outhash{"test"}}; #Ausgabe "ichdu"
              ---------------------

              Ich verschachtele einen Hash in einem anderen. Wenn ich nun den "inneren" Hash bearbeite und anschließend erneut hole, ist die Änderung wieder verschwunden... Ich möchte aber natürlich haben, dass diese bestehen bleibt. Scheinbar mache ich irgendwas bei der Refernzierung / Dereferenzierung falsch.
              Kann mir dabei jemand weiterhelfen? Ich steh da echt auf dem Schlauch.. :-(

              vg und Danke!
              Stephan

              1. Hier mal ein komplettes Programm um mein Problem zu verdeutlichen (es soll KEINEN sinnvollen Zweck erfüllen, sondern einfach nur das Problem zeigen!)

                Welches Problem den, die Frage ist was du erreichen willst?

                Ich verschachtele einen Hash in einem anderen.

                Wo verschachtelst du etwas?

                In deinem Beispiel werden kopien erzeugt, diese weist du den verschiedenen Variabeln zu. Du willst dich vielleicht näher mit Referenzen beschäftigen, ich meine den Link dir gezeigt zu haben.

                Struppi.

                1. Was ich erreichen will? Ich will einen zweidimensionalen Hash erzeugen und die inhalte verändern können! Nicht mehr und nicht weniger! Und das ganze (siehe Eingangsfrage) dynamisch und nicht mit vorher bekannten Keys. Aber auch ohne dynamik (siehe letzen Code) klappt das nicht.
                  Leider konnte ich der Doku nicht entnehmen, wie man das korrekt macht! Daher die Hoffnung, dass mir hier vielleicht jemand den Denkfehler zeigen kann. Könnte mir jemand zu diesem Problem vielleicht einen kleinen Beispielcode zeigen? Und zwar wie gesagt, nicht mit hartcodierten Hashes, sondern dynamisch...

                  Danke,
                  Sephan

                  1. Was ich erreichen will? Ich will einen zweidimensionalen Hash erzeugen und die inhalte verändern können!

                    Dann sollte perldsc: Hashes of Hashes die bessere Lektüre sein.

                    Und das ganze (siehe Eingangsfrage) dynamisch und nicht mit vorher bekannten Keys.

                    Also bezieht sich Deine Dynamik darauf, dass Du die Schlüssel vorher nicht kennst?

                    Leider konnte ich der Doku nicht entnehmen, wie man das korrekt macht! Daher die Hoffnung, dass mir hier vielleicht jemand den Denkfehler zeigen kann. Könnte mir jemand zu diesem Problem vielleicht einen kleinen Beispielcode zeigen? Und zwar wie gesagt, nicht mit hartcodierten Hashes, sondern dynamisch...

                    Ich versuche es nochmal in Anlehnung an perldsc:

                    use strict;  
                      
                    my @mainkeys = qw(Feuerstein Geroellheimer);  
                    my @subkeys = qw(Lead Wife Child);  
                    my $values = { Feuerstein => ['Fred','Wilma','Pebbles'],  
                                   Geroellheimer => ['Barney','Betty','Bamm-Bamm']  
                                 };  
                      
                    my %result;  
                      
                    foreach(@mainkeys) {  
                      my %dummy;  
                      @dummy{ @subkeys } = @{$values->{$_}};  
                      $result{$_} = \%dummy;  
                    }  
                      
                    foreach my $family (keys %result) {  
                      print "Family: $family\n";  
                      foreach(keys %{$result{$family}}) {  
                        print "$_ is $result{$family}->{$_}\n";  
                      }  
                    }
                    

                    Hier hast Du einen Hash von Hashreferenzen, kombiniert mit Hash-Slices und Referenzen. Ist es das, wo Du hinwillst?

                    Siechfred

                    --
                    Wir vom Moderatorenteam haben keinerlei Humor, von dem wir wüssten.
                  2. Was ich erreichen will? Ich will einen zweidimensionalen Hash erzeugen und die inhalte verändern können! Nicht mehr und nicht weniger!

                    Dann kann ich dir nur (zum dritten Mal) diesen Link empfehlen:
                    http://perldoc.perl.org/perldsc.html

                    Könnte mir jemand zu diesem Problem vielleicht einen kleinen Beispielcode zeigen? Und zwar wie gesagt, nicht mit hartcodierten Hashes, sondern dynamisch...

                    Wenn wir wüßten, was du mit dynamisch meinst könnten wir das, aber Siechfred hat's ja schon versucht, vielleicht hilft dir das ja.

                    Struppi.

      2. Danke für die Antwort! Leider klappt das noch nicht so richtig wie ich will. Vielleicht mach ich noch was falsch.

        Ich habe keinen blassen Schimmer, was Du vorhast, folgendes allerdings funktioniert:

        my %domains = ( 'example.org' => { foo => 0, bar => 42 },  
                        'example.net' => { foo => 42, bar => 0 }  
                      );  
        my %addresses = %{$domains{'example.org'}};  
          
        foreach(sort keys %addresses) {  
          print "$_ = $addresses{$_}\n";  
        }
        

        Die Ausgabe mit dem HASH(...) bedeutet nichts anderes, als dass $ref eine Hashreferenz ist, in Klammern ist die Speicheradresse angegeben.

        Siechfred

        --
        Wir vom Moderatorenteam haben keinerlei Humor, von dem wir wüssten.
      3. Hi Stephan,


        my $ref;
        $ref = $domains{"test.de"};
        %addresses = %{$ref};

        Hier kopierst du den Inhalt  von %{$ref} in %adresses.

        $addresses{"juhu@test.de"} = 3;

        hier änderst du %adresses NICHT %{$ref}.

        print(keys(%addresses));
        print("\n");
        print($ref . "\n");

        $ref = $domains{"test.de"};
        my %addresses2 = %{$ref};

        Hier kopierst du den Inhalt  von %{$ref} in %adresses2.

        print(keys(%addresses2));

        %adresses2 hat natürlich keinen Inhalt.

        print("\n");
        print($ref . "\n");

        Die Ausgabe ist jedoch die folgende:


        juhu@test.de
        HASH(0x19620b0)

        HASH(0x19620b0)

        stimmt! Ist dir jetzt auch klar warum? Bitte antworten...

        wenn du hingegen sowas machen würdest (ungetestet)

          
        $domains{"test.de"}={};  
          
          
        $domain_ref = $domains{"test.de"};  
        $domain_ref->{'juhu@test.de'} = 3;  
          
        $domain_ref2 = $domains{"test.de"};  
        $domain_ref2->{'hoho@test.de'} = 42;  
          
        $domain_ref3 = $domains{"test.de"};  
          
        our %hashname;  
        *hashname= $domains{"test.de"};  
          
        $,="\n";  
        print keys(%$domain_ref3);  
        print "\n---\n";  
        print keys(%hashname)  
          
        
        

        solltest du erreichen was du wolltest

        hoho@test.de
        juhu@test.de
        ---
        hoho@test.de
        juhu@test.de

        bye
         Kurt

        1. Hey Kurt, ich dachte, wir hätten Dich mit dem Namespace-Thread vergrault, schön, mal wieder was von Dir zu lesen :)

          $,="\n";
          print keys(%$domain_ref3);
          print "\n---\n";
          print keys(%hashname)

            
          Just for the records: Weise niemals einer von Perl vordefinierten Variablen einen anderen als den vordefinierten Wert zu. In Deinem kleinen Beispiel ist das unproblematisch, bei umfangreichen Projekten kann das aber zu ungewollten Fehlern führen. Besser wäre hier:  
            
          ~~~perl
          {  
            local $, = "\n";  
            print keys(%$domain_ref3);  
            print "\n---\n";  
            print keys(%hashname)  
          }
          

          Siechfred

          --
          Wir vom Moderatorenteam haben keinerlei Humor, von dem wir wüssten.
          1. Hi Siechfred,

            ich dachte, wir hätten Dich mit dem Namespace-Thread vergrault,

            wieso, habe selbst am meisten gelernt!

            (bin nur froh dass ich hier nicht auch die Perl5'schen Dereferenzierungsregeln logisch erklären muss!)

            schön, mal wieder was von Dir zu lesen :)

            danke! :)

            In Deinem kleinen Beispiel ist das unproblematisch,

            eben! :)

            tschau
             Kurt

            1. Hallo Kurt!

              (bin nur froh dass ich hier nicht auch die Perl5'schen Dereferenzierungsregeln logisch erklären muss!)

              Hm, könntest Du mir das mal logisch erklären? ;)

              Viele Grüße aus Frankfurt/Main,
              Patrick

              --

              _ - jenseits vom delirium - _
              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              Nichts ist unmöglich? Doch!
              Heute schon gegökt?
              1. Hi

                Hm, könntest Du mir das mal logisch erklären? ;)

                meine Abneigung? Klar!

                Die Derefenzierungsregeln  haben lauter inkompatible Ausnahmeregeln.

                z.B ist

                $hash{dim1}{dim2}{dim3}

                eine Kurzschreibung für

                $hash{dim1}->{dim2}->{dim3}

                aber

                $ref{dim1}

                ist KEINE Kurzschreibung für

                $ref->{dim1} bzw $$ref{dim1}

                sondern bestenfalls für

                %ref->{dim1}

                Diese Inkosistenz hat soviele in den Wahnsinn getrieben, das  in Perl6 radikal aufgeräumt wird.

                Dort steht

                %hash{'dim1'} dann für das Hashelement  (statt perl5 $hash{dim1})

                sodass eindeutig gilt
                $ref{'dim1'} == $ref->{'dim1'}

                Man kann also von links nach rechts lesend verstehen was für ein Variablentyp dem Sigil folgt ... hier folgt auf $ immer ein Skalar/Referenz und nie der Name eines Hashs oder Arrays.

                Dieser syntaktische Bruch wird aber m.E. die meisten Kompatibilitätsprobleme beim migrieren von perl5 Code erzeugen...

                Bye
                 Kurt

                1. Diese Inkosistenz hat soviele in den Wahnsinn getrieben, das  in Perl6 radikal aufgeräumt wird.

                  Bis Perl 6 erschienen ist, werden noch Monde vergehen, bis es nicht nur auf den Bastelsystemen von Perl-Fans (wie ich ;) ), sondern auch bei den Hostern verfügbar ist, wird's vermutlich noch länger dauern. Zwar soll Perl 6 wohl einen Abwärtskompatibilitätsmodus bieten, aber trotzdem müssten tausende Scripts geändert werden, und wenn es nur 1 Codezeile ist, um den Modus zu aktivieren.

                  Siechfred

                  --
                  Wir vom Moderatorenteam haben keinerlei Humor, von dem wir wüssten.
                  1. Bis Perl 6 erschienen ist, werden noch Monde vergehen,

                    Das ändert aber leider nichts an der Tatsache das Perl5 inkosistent ist und viele deswegen zu Python abwandern.

                    Kurt

                  2. Zwar soll Perl 6 wohl einen Abwärtskompatibilitätsmodus bieten, aber trotzdem müssten tausende Scripts geändert werden, und wenn es nur 1 Codezeile ist, um den Modus zu aktivieren.

                    Das ist so nicht korrekt, AFAIK soll man Perl5 Code auch auf Parrot (der Virtuel Machine) laufen lassen können, sodass Perl6 auf alle fertigen Perl5 Module zugreifen kann.

                    Schließlich hat Parrot von Anfang an den Anspruch gehabt, dass man dort auch andere Scriptsprachen ausführen kann...

                    Bye
                     Kurt

                    1. Das ist so nicht korrekt

                      Hm, ich verstehe die mageren Infos in den Perl6-FAQ da anders. Allerdings ist die Diskussion eh akademisch, da noch nicht abzusehen ist, wann Perl 6 fertig sein wird und wie die Abwärtskompatibilität dann geregelt ist. Ich mag mir irgendwie noch nicht so recht vorstellen, wie Parrot vom Script auf die Perl-Version schließen will, ohne dass es ihm explizit gesagt wird. Aber wie gesagt, eine rein akademische Diskussion ;)

                      Siechfred

                      --
                      Wir vom Moderatorenteam haben keinerlei Humor, von dem wir wüssten.
                      1. Hi

                        Hm, ich verstehe die mageren Infos in den Perl6-FAQ da anders.

                        ziemlich veraltet...

                        Das bezieht sich m.E. auf Ponie und Ponie wurde schon vor über einem Jahr eingestellt weil sich die Perl5 syntaxregeln nur noch von einem kranken Hirn abbilden lassen können...

                        Statt einen neuen Compiler für Perl5 zu stricken soll jetzt eher Perl5 Bytecode in Parrot-Bytecode abgebildet werden.

                        Da Parrot an sich deutlich schneller sein soll, ist das ein Gewinn an sich.

                        Allerdings ist die Diskussion eh akademisch, da noch nicht abzusehen ist, wann Perl 6 fertig sein wird und wie die Abwärtskompatibilität dann geregelt ist.

                        Nein du kannst jetzt schon mit Perl6 Code in Pugs arbeiten, allerdings nicht performant. AFAIK ist 2008 inoffiziell Termin.

                        Ausserdem fließen viele Perl6 Überlegungungen in Form von Modulen wieder zu Perl5 zurück, die kompatibleren und besser wartbaren Code ermöglichen.

                        Auf jeden fall helfen Kenntnisse in Perl6 die Fallstricke in Perl5 zu verstehen.

                        mach dich mal schlau ...
                        Kurt

                        1. Hm, ich verstehe die mageren Infos in den Perl6-FAQ da anders.
                          ziemlich veraltet...

                          Hm, gibt's andere offizielle Quellen?

                          Statt einen neuen Compiler für Perl5 zu stricken soll jetzt eher Perl5 Bytecode in Parrot-Bytecode abgebildet werden.

                          Die verlinkte Seite verweist doch ausdrücklich auf Parrot.

                          Allerdings ist die Diskussion eh akademisch, da noch nicht abzusehen ist, wann Perl 6 fertig sein wird und wie die Abwärtskompatibilität dann geregelt ist.
                          Nein du kannst jetzt schon mit Perl6 Code in Pugs arbeiten, allerdings nicht performant. AFAIK ist 2008 inoffiziell Termin.

                          Quelle?

                          Auf jeden fall helfen Kenntnisse in Perl6 die Fallstricke in Perl5 zu verstehen.
                          mach dich mal schlau ...

                          Wo? Die auf den Seiten der Perl Foundation jedenfalls konnte ich Deine Hinweise nicht verifizieren. Selbst auf der Seite von Larry Wall war nichts dergleichen zu finden.

                          Siechfred

                          --
                          Wir vom Moderatorenteam haben keinerlei Humor, von dem wir wüssten.
                          1. Hm, ich verstehe die mageren Infos in den Perl6-FAQ da anders.
                            ziemlich veraltet...

                            Hm, gibt's andere offizielle Quellen?

                            englisches Wikipedia und Google, diese Site hat nur ein Copyright bis 2005 ...

                            Allerdings ist die Diskussion eh akademisch, da noch nicht abzusehen ist, wann Perl 6 fertig sein wird und wie die Abwärtskompatibilität dann geregelt ist.
                            Nein du kannst jetzt schon mit Perl6 Code in Pugs arbeiten, allerdings nicht performant. AFAIK ist 2008 inoffiziell Termin.

                            Quelle?

                            <perl6.de>

                            mein Kumpel hat sich schon pugs installiert und experimentiert.

                            Wo? Die auf den Seiten der Perl Foundation jedenfalls konnte ich Deine Hinweise nicht verifizieren. Selbst auf der Seite von Larry Wall war nichts dergleichen zu finden.

                            englisches Wikipedia und Google, deine Seite hatte nur ein Copyright bis 2005 ...

                            Man muss dazusagen das Audrey Tang mit ihren Alleingang einen perl6-Interpreter in Haskell zu schreiben alles redifiniert hat.

                            http://pugs.blogs.com/pugs/summary/index.html

                            Kurt

                            1. Quelle?

                              <perl6.de>

                              sorry
                              http://perl-6.de/

                            2. Hm, gibt's andere offizielle Quellen?
                              englisches Wikipedia und Google

                              Das sind keine offiziellen Quellen. Soweit ich weiß, wird Perl 6 nachwievor von der Perl Foundation gesteuert.

                              diese Site hat nur ein Copyright bis 2005 ...

                              Hm? Es gibt dort durchaus aktuelle Informationen aus 2007.

                              <perl6.de>

                              Das ist soweit ich das sehe die private Seite eines Perl6-Fans, allerdings eine sehr informative *bookmarked*

                              Siechfred

                              --
                              Coping With Scoping (Deutsche Übersetzung)
                              Als Moderator habe ich keinerlei Humor, von dem ich wüsste.
                              1. Hi

                                Das sind keine offiziellen Quellen. Soweit ich weiß, wird Perl 6 nachwievor von der Perl Foundation gesteuert.

                                Klar und Stefan Münz steuert nachwievor Selfhtml.

                                the perl foundation ... "Carries the *legal* responsibility"

                                Zumindest ist ein bischen Recherche valabler als einfach Alexander zu zitieren  http://forum.de.selfhtml.org/archiv/2007/10/t160306/#m1043908

                                Im übrigen sagte ich oben bereits "inoffizieller Termin"!

                                diese Site hat nur ein Copyright bis 2005 ...

                                Hm? Es gibt dort durchaus aktuelle Informationen aus 2007.

                                Naja "This week" endet "February 12, 2006".

                                Die wichtigsten Impulse gehen von Pugs aus und niemand in der Perl-Foundation hatte je "gesteuert" das sowas in Haskell realisiert wird. Und jetzt richten sie ihre ganze Roadmap nach Pugs aus.

                                Wie auch immer, wenn man die subtilen Probleme von Perl5 erfassen möchte sollte man sich mit den Änderungen im Perl6-Syntax auseinandersetzen.

                                Unabhängig davon ist Parrot einen JIT-VM und wird Scripte (auch Perl5) drastisch schneller ausführen können.

                                Wer daran nicht glaubt sollte sich heute schon nach Python orientieren.

                                bye
                                 Kurt

                                1. Das sind keine offiziellen Quellen. Soweit ich weiß, wird Perl 6 nachwievor von der Perl Foundation gesteuert.
                                  Klar und Stefan Münz steuert nachwievor Selfhtml.

                                  Unsachlichkeiten sind keiner Diskussion förderlich.

                                  Zumindest ist ein bischen Recherche valabler als einfach Alexander zu zitieren  http://forum.de.selfhtml.org/archiv/2007/10/t160306/#m1043908

                                  Ich weiß, dass Alexander das gesagt hat, und ich schließe mich ihm an, wo ist da das Problem? Du darfst im Übrigen gerne selber recherchieren, welche Hoster derzeit welche Perl-Version bieten.

                                  Die wichtigsten Impulse gehen von Pugs aus und niemand in der Perl-Foundation hatte je "gesteuert" das sowas in Haskell realisiert wird. Und jetzt richten sie ihre ganze Roadmap nach Pugs aus.

                                  Ich habe nie angezweifelt, dass an Perl 6 gearbeitet wird, ich habe nur bisher noch keinerlei Infos gefunden, für wann die Fertigstellung avisiert ist. Du nennst (ebenso wie perl-6.de) 2008. Mag ja sein, dass es so kommt. Doch ich bleibe mit Alexander dabei: Bis sich Perl 6 flächendeckend durchgesetzt hat, wird 2008 lange vorbei sein.

                                  Wie auch immer, wenn man die subtilen Probleme von Perl5 erfassen möchte sollte man sich mit den Änderungen im Perl6-Syntax auseinandersetzen.

                                  Das ist Deine Meinung, meine ist: Erst dann, wenn Perl 6 *fertig* ist, alles andere ist m.E. Sache der Entwickler, und zum Mitentwickler von Perl 6 fühle ich persönlich mich in keinster Weise berufen, da ich keinerlei professionellen Bezug zu Perl habe.

                                  Dies ist mein Standpunkt. Wenn das bei Dir anders sein sollte, dann habe ich ganz einfach kein Problem damit. Ich habe lediglich ein Problem damit, wenn ich auf konkrete Nachfragen mit Hinweisen auf irrelevante Copyright-Hinweise, die englische Wikipedia oder Google abgefertigt werde.

                                  Siechfred

                                  --
                                  Coping With Scoping (Deutsche Übersetzung)
                                  Als Moderator habe ich keinerlei Humor, von dem ich wüsste.
                                  1. Das sind keine offiziellen Quellen. Soweit ich weiß, wird Perl 6 nachwievor von der Perl Foundation gesteuert.
                                    Klar und Stefan Münz steuert nachwievor Selfhtml.

                                    Unsachlichkeiten sind keiner Diskussion förderlich.

                                    Zwei Non-Profit-Orgas miteinander zu vergleichen ist durchaus sachlich.

                                    Ich habe lediglich ein Problem damit, wenn ich auf konkrete Nachfragen mit Hinweisen auf irrelevante Copyright-Hinweise, die englische Wikipedia oder Google abgefertigt werde.

                                    Siehste und ich hab ein Problem wenn jemand nachplappert was ich schonmal vorgebetet bekommen habe ...

                                    Whatever wenn dieses Forum nur Perl im Kontext von Web-Hostern diskutieren möchte, sollte ich mich lieber umgucken ...

                                    Kann mir jemand gute allgemeine Perl-Foren / NGs empfehlen?

                                    Tschau
                                     Kurt

                                    1. Ich habe lediglich ein Problem damit, wenn ich auf konkrete Nachfragen mit Hinweisen auf irrelevante Copyright-Hinweise, die englische Wikipedia oder Google abgefertigt werde.
                                      Siehste und ich hab ein Problem wenn jemand nachplappert was ich schonmal vorgebetet bekommen habe ...

                                      Ich habe das Gefühl, dass Du mich nicht verstehen willst. Nur, weil jemand vor mir etwas gesagt hat, was ich für zutreffend halte, ist das noch kein Nachgeplapper. Es ist mir schleierhaft, warum Du so gereizt reagierst und meinst, persönlich werden zu müssen.

                                      Whatever wenn dieses Forum nur Perl im Kontext von Web-Hostern diskutieren möchte, sollte ich mich lieber umgucken ...

                                      Dieses Forum ist eine Ergänzung zu SELFHTML, das weißt Du sicher. Alles drumherum ist schmückendes Beiwerk. Und ja, es geht im Zusammenhang mit Perl primär um den Einsatz im Webkontext. Es steht außer Frage, dass Perl mehr kann als das, was im Webkontext nötig ist, und dazu kann man hier auch Fragen stellen und gerne auch diskutieren.

                                      Kann mir jemand gute allgemeine Perl-Foren / NGs empfehlen?

                                      Ich würde Dir ja die Perl-Community empfehlen, zumindest verweise ich Fragende dorthin, wenn wir hier nicht oder nicht mehr helfen können. Ich fürchte allerdings, dass die es hinsichtlich Perl 6 ähnlich differenziert sehen. Aber überzeuge Dich selber.

                                      Siechfred

                                      --
                                      Coping With Scoping (Deutsche Übersetzung)
                                      Als Moderator habe ich keinerlei Humor, von dem ich wüsste.
                                      1. Hi Siechfred

                                        Es ist mir schleierhaft, warum Du so gereizt reagierst und meinst, persönlich werden zu müssen.

                                        Ok, vielleicht hab ich überreagiert

                                        Kann mir jemand gute allgemeine Perl-Foren / NGs empfehlen?

                                        Ich würde Dir ja die Perl-Community

                                        Danke für den Hinweis, die haben was Perl6 anbelangt auch sowieso recht gute Seiten

                                        http://faq.perl-community.de/bin/view/Wissensbasis/Perl6Tutorial

                                        Ihr Board ist etwas hässlich wenn man sich an selfhtml gewöhnt hat...

                                        Bye
                                         Kurt

                2. Die Derefenzierungsregeln  haben lauter inkompatible Ausnahmeregeln.

                  z.B ist

                  $hash{dim1}{dim2}{dim3}

                  eine Kurzschreibung für

                  $hash{dim1}->{dim2}->{dim3}

                  Finde ich nicht besonders unlogisch und hat mich noch nie gestört, da es keine mehrdimensonale Arrays/Hashes gibt, ist klar das ab der zweiten Ebenenen eine Referenz benutzt wird, wobei ich aber die Kurzform nicht verwenden würde, da sie tatsächlich was falsches suggeriert.

                  aber

                  $ref{dim1}

                  ist KEINE Kurzschreibung für

                  $ref->{dim1} bzw $$ref{dim1}

                  Natürlich nicht, da es eindimensonale Arrays/Hashes gibt und du dann natürlich explizit angeben musst ob du eine referenz oder nicht meinst.

                  Dort steht

                  %hash{'dim1'} dann für das Hashelement  (statt perl5 $hash{dim1})

                  Wird Puristen vielleicht nicht glücklich machen, aber ich geb dir Recht das sich das leichter lesen läßt.

                  Struppi.

                3. Hallo!

                  Die Derefenzierungsregeln  haben lauter inkompatible Ausnahmeregeln.

                  Ehrlich gesagt kann ich nicht ganz nachvollziehen, wo du da eine echte Inkonsistenz siehst, auch wenn ich mit dir übereinstimme, dass es wohl für einen Anfänger arg kompliziert ist.

                  Der Grund für die scheinbar unterschiedliche Syntax ist doch, dass da auch zwei unterschiedliche Sachen gemacht werden. Einmal der Zugriff auf ein Hashelement _ohne_ vorherige Derefferenzierung, und einmal _mit_ vorheriger Dereferenzierung, weil der vorstehende Wert keine Variable, sondern eine Referenz ist.

                  $hash{dim1}{dim2}{dim3}

                  eine Kurzschreibung für

                  $hash{dim1}->{dim2}->{dim3}

                  ^^^
                  auch bei diesem Beispiel fehlt bei dem Hashzugriff der Derefferenzierungsoperator

                  aber

                  $ref{dim1}

                  ist KEINE Kurzschreibung für

                  $ref->{dim1} bzw $$ref{dim1}

                  exakt, genau wie

                  $hash->{dim1}->{dim2}->{dim3}

                  keine Kurzform für

                  $hash{dim1}{dim2}{dim3}

                  ist. Aber nur in der Form wären es analoge Beispiele.

                  Diese Inkosistenz hat soviele in den Wahnsinn getrieben, das  in Perl6 radikal aufgeräumt wird.

                  Dort steht

                  %hash{'dim1'} dann für das Hashelement  (statt perl5 $hash{dim1})

                  sodass eindeutig gilt
                  $ref{'dim1'} == $ref->{'dim1'}

                  Das wurde glaubich "Everything is a reference" benannt, oder? Auf jeden Fall ist es einfacher zu verstehen und wohl auch weniger fehleranfällig, wenn das Sigil vom tatsächlichen Variablentyp und nicht vom Rückgabetyp des Aufrufes abhängig ist :)

                  Grüße, Skrilax

                  --
                  Democracy is a device which ensures that we shall be governed no better than we deserve.
                  (G. B. Shaw)
                4. Hallo Kurt!

                  Die Derefenzierungsregeln  haben lauter inkompatible Ausnahmeregeln.

                  Vielen Dank für die Erläuterungen.

                  Perl6

                  Bis es soweit ist, habe ich vielleicht gerade noch Zeit, Perl5 zu verdauen ;)

                  Und daher eine Frage, die mehr oder weniger im Zusammenhang steht... Ich suche eine elegantere Möglichkeit, die Werte eines Hashs in einem Hash zu sortieren, als diese in ein temporäres Array zu pushen:

                    
                   use strict;  
                   use mywebdata;  
                          my @temp;  
                   foreach my $key (keys %FILES) {  
                       push (@temp, $FILES{$key}{'DESCRIPTION'});  
                   }  
                   foreach (sort @temp) { print $_, $/ };  
                  
                  

                  Der Hash in mywebdata.pm sieht wie folgt aus:

                    
                  %FILES=(A_index   =>  { 'TITLE' => "Amazing Sucky Intro/Atomic Sitemap",  
                     'DESCRIPTION' => "Atomic-Eggs - Die humosophische Site.",  
                     'ALT' => [ "http://old.atomic-eggs.com", "http://selfpezial.atomic-eggs.com" ],  
                     'CREATED' => "2006-08-27T00:00+01:00"  
                                        },  
                   B_wae_00  =>  { 'TITLE' => "Willkommen auf Atomic Eggs",  
                     'DESCRIPTION' => "Begrüßung, Willkommen, Startseite der Rubrik »Willkommen auf Atomic Eggs«.",  
                     'ALT' => [ "http://old.atomic-eggs.com/home.html" ],  
                     'CREATED' => "2006-08-27T00:00+01:00"  
                                        },  
                   B_wae_01  =>  { 'TITLE' => "Informationen für Erstbesucher",  
                     'DESCRIPTION' => "Informationen für Besucher, die das erste Mal Atomic Eggs »betreten«.",  
                     'ALT' => [ undef ],  
                     'CREATED' => "2006-08-27T00:00+01:00"  
                          },  
                  .  
                  .  
                  .  
                  .  
                  .  
                  .  
                         );  
                  
                  

                  Das soll eine Abbildung meines Webs sein, die dateiabhängige Head-Inhalte (title, meta, link-Elemente) für ein Skript bereit hält, das mir den kompletten <head>-Bereich generiert (ich habe bereits ein funktionierendes Skript, das eben das macht, nur das stelle ich hier lieber nicht zur Diskussion *g*).

                  Viele Grüße aus Frankfurt/Main,
                  Patrick

                  --

                  _ - jenseits vom delirium - _
                  [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                  Nichts ist unmöglich? Doch!
                  Heute schon gegökt?
                  1. Hallo Patrick!

                    Was möchtest du erhalten? Ein sortiertes Array der Descriptions oder ein nach Description sortiertes Array der Keys des Hashes %FILES?

                    Letzteres erscheint mir langfristig sinnvoller, aber ich denke mit sowas bekommste ersteres hin

                    $,="\n";
                    print sort
                     map { $_->{'DESCRIPTION'} }
                     values %FILES ;

                    oder

                    foreach ( sort { $a->{'DESCRIPTION'} <=>  $b->{'DESCRIPTION'} } values %FILES)
                     {
                     print $_->{DESCRIPTION},"\n";
                            };

                    poste aber bitte nächstesmal gleich ausführbaren code und jage ihn besser noch vorher durch perltidy.

                    Bye
                     Kurt

                    1. Hallo Kurt!

                      Was möchtest du erhalten? Ein sortiertes Array der Descriptions oder ein nach Description sortiertes Array der Keys des Hashes %FILES?

                      Einfach eine alphabetisch geordnete Liste der jeweiligen »Descriptions«. Und alle Varianten (meine mit dem Array @temp und Deine zwei) geben sie auch aus, wenn man hier:

                      foreach ( sort { $a->{'DESCRIPTION'} <=>  $b->{'DESCRIPTION'} } values %FILES)

                      den Raumschiffoperator durch »cmp« ersetzt. Mit »<=>« zwar auch, aber erst nach den Warnungen (Argument is'nt numeric...).

                      Gut, ich schätze, dass die Variante mit map perfomanter ist, sollte die Dateiliste (sprich, der Hash %FILES) sehr lang werden?

                      jage ihn besser noch vorher durch perltidy.

                      Was'n das?

                      Viele Grüße aus Frankfurt/Main,
                      Patrick

                      --

                      _ - jenseits vom delirium - _
                      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                      Nichts ist unmöglich? Doch!
                      Heute schon gegökt?
                      1. Hi

                        den Raumschiffoperator durch »cmp« ersetzt. Mit »<=>« zwar auch, aber erst nach den Warnungen (Argument is'nt numeric...).

                        UPS! sorry stimmt!

                        Gut, ich schätze, dass die Variante mit map perfomanter ist, sollte die Dateiliste (sprich, der Hash %FILES) sehr lang werden?

                        Auf jeden Fall, der Sortierungsalgorithmus hat AFAIK n*log(n)  Aufwand, das wird alles bei der  "Schwartzschen Transformation" detailliert diskutiert.

                        http://en.wikipedia.org/wiki/Schwartzian_transform

                        Und wenn man die verstanden hat ist meine gepostete map-Variante auch nur ein triviale Abart. (und sehr elegant!)

                        jage ihn besser noch vorher durch perltidy.

                        Was'n das?

                        der beste Prettyprinter für perl http://perltidy.sourceforge.net/tutorial.html

                        habe sogar von Leuten gelesen die es vergewaltigen um PHP zu formatieren! :)

                        Tschau
                         Kurt

                  2. Und daher eine Frage, die mehr oder weniger im Zusammenhang steht... Ich suche eine elegantere Möglichkeit, die Werte eines Hashs in einem Hash zu sortieren, als diese in ein temporäres Array zu pushen:

                    Vielleicht eine
                    Schwartz'sche Transformation

                    my @ergebnis = map { $_->[0] }  
                                   sort { $a->[1] cmp $b->[1] }  
                                   map { [ $FILES{$_}, $FILES{$_}{DESCRIPTION} ] } keys %FILES;  
                      
                    use Data::Dumper;  
                    print Dumper \@ergebnis;
                    

                    Struppi.

                    1. Hallo Struppi!

                      my @ergebnis = map { $_->[0] }

                      sort { $a->[1] cmp $b->[1] }
                                     map { [ $FILES{$}, $FILES{$}{DESCRIPTION} ] } keys %FILES;

                        
                      Danke, funktioniert auch.  
                        
                      
                      > use Data::Dumper;  
                        
                      Mit Data::Dumper wollte ich mich eh näher beschäftigen... ;)  
                        
                      Viele Grüße aus Frankfurt/Main,  
                      Patrick
                      
                      -- 
                      ![](http://www.atomic-eggs.com/fuernA.jpg)  
                        
                      \_ - jenseits vom delirium - \_  
                        
                      [[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash](http://www.atomic-eggs.com/)]  
                      Nichts ist unmöglich? [Doch!](http://www.atomic-eggs.com/cwi/cwi_4.shtml)  
                      Heute schon ge[gök](http://goek.atomic-eggs.com/goek_goek.html)t?
                      
                      1. use Data::Dumper;

                        Mit Data::Dumper wollte ich mich eh näher beschäftigen... ;)

                        Muss man, auf jeden Fall. Gerade weil Perl ja so unlogisch ist ;-)
                        Zum debuggen auf jeden Fall unverzichtbar.

                        Struppi.