hotti (no reg): Vererbung klappt nicht

hi,

ich hab da ein eigenes Modul Rabbit.pm, was von Tie::Hash die Methoden erstmal alle erben soll:

  
package Rabbit;  
  
use strict;  
require Tie::Hash;  
@Rabbit::ISA = qw(Tie::Hash);  
  
  
package main;  
  
tie(my %h, 'Rabbit'); # Rabbit doesn't define a TIEHASH method  

tie() gibt jedoch eine FM, s.o. Was läuft hier schief, bzw. was fehlt noch, damit Rabbit.pm von Tie::Hash erbt?

Bitte mal um Hinweise,
Hotti

  1. ich hab da ein eigenes Modul Rabbit.pm, was von Tie::Hash die Methoden erstmal alle erben soll:

    Warum? Warum verwendest du nicht einfach DB_File?
    Ich finde auch, dass die Doku nicht sonderlich ausführlich ist, aber wenn man sie genau durchliest, lese ich da heraus, dass dieses Modul nicht als Modul zum allgemeinen Gebrauch benötigt wird, sondern als Grundlage für z.b. DB_File.

    require Tie::Hash;
    @Rabbit::ISA = qw(Tie::Hash);

    Vererbung so ist umständlich es gibt mehrere Module die das verienfachen. Ich benutze parent, das ist ein schnelles und einfaches Modul und es reicht dann:
    use parent 'Tie::Hash';

    tie() gibt jedoch eine FM, s.o. Was läuft hier schief, bzw. was fehlt noch, damit Rabbit.pm von Tie::Hash erbt?

    Eine TIEHASH Methode fehlt

    Struppi.

    1. hi,

      Vererbung so ist umständlich es gibt mehrere Module die das verienfachen. Ich benutze parent, das ist ein schnelles und einfaches Modul und es reicht dann:
      use parent 'Tie::Hash';

      das steht mir leider nicht zur Verfügung.

      Eine TIEHASH Methode fehlt

      Genau diese Method sollte ja geerbt werden, zumindest vorerst, die will ich später überlagern. Btw., in der Doku steht, dass lediglich DESTROY eigens zu schreiben ist.

      Noch Ideen?

      Hotti

      1. hi,

        Vererbung so ist umständlich es gibt mehrere Module die das verienfachen. Ich benutze parent, das ist ein schnelles und einfaches Modul und es reicht dann:
        use parent 'Tie::Hash';

        das steht mir leider nicht zur Verfügung.

        Mal abgesehen davon, dass Module installieren eigentlich zu Perl dazu gehört, es ist auch ein reines Perl Modul was ohne Probleme überall installierbar ist, hatte ich aber auch gesagt, dass es mehrere gibt und base ist z.b. überall installiert.

        Noch Ideen?

        Ja, du benutzt das falsche Modul, was willst du denn überhaupt von diesem Modul?

        Struppi.

        1. hi,

          Mal abgesehen davon, dass Module installieren eigentlich zu Perl dazu gehört,

          Klar. Wenn Du der Cheffe auf dem jeweiligen System bist. Bist Du aber nicht und ich auch nicht in dem Fall.

          Noch Ideen?

          Ja, du benutzt das falsche Modul,

          Tie::Hash, Tie::StdHash - base class definitions for tied hashes

          Dann hab ich wohl den Begriff "base class" falsch verstanden. Grundsätzlich geht die Vererbung über @ISA, auch ohne use parent; das ist nur ein wrapper.

          was willst du denn überhaupt von diesem Modul?

          So wies aussieht, guck ich mir da nur was ab ;-)
          Ansonsten werde ich für mein Rabbit.pm sowieso alle Methoden selbst schreiben, die Wichtigsten sind Konstruktor und Destruktor. Der Rest ist Copy::Paste.

          Btw., der Name Rabbit kommt nicht von ungefähr. Das Modul hat was, so wie bei einem Zauberer, der ein Kaninchen aus dem schwarzen Hut zaubert.

          Perl ist nicht nur toll, sondern AffenTittenOverGeil!!!!!11!!!

          Grüße an Alle,
          Hotti

          --
          # php ist bescheuert.
          1. Mal abgesehen davon, dass Module installieren eigentlich zu Perl dazu gehört,

            Klar. Wenn Du der Cheffe auf dem jeweiligen System bist. Bist Du aber nicht und ich auch nicht in dem Fall.

            In dem Fall reicht ein FTP Zugang.

            Noch Ideen?

            Ja, du benutzt das falsche Modul,

            Tie::Hash, Tie::StdHash - base class definitions for tied hashes

            Dann hab ich wohl den Begriff "base class" falsch verstanden.

            JA, "base class" heißt hier eher abstrakte Klasse, denn nichts weiter ist Tie::Hash

            was willst du denn überhaupt von diesem Modul?

            So wies aussieht, guck ich mir da nur was ab ;-)
            Ansonsten werde ich für mein Rabbit.pm sowieso alle Methoden selbst schreiben, die Wichtigsten sind Konstruktor und Destruktor.

            Na gut, ich versteh trotzdem nicht was du von Tie::Hash erwartest.

            Struppi.

            1. hi,

              Na gut, ich versteh trotzdem nicht was du von Tie::Hash erwartest.

              Ich erwarte, dass mein Modul die Methoden erbt. Noch dazu, weil das so in der Dokumentation steht und erst recht, weil ich den Code aus der Dokumentation kopiert habe. Nur mal so nebenbei: Das Erbe von Tie::Array ist auch nichts wert. Vermutlich ists ein Bug, aber ich habe weder Lust, noch Zeit, darüber mit Dir zu diskutieren, warum die Beispiele aus dem Kochbuch auf meiner Kiste nicht funktionieren, da wirst auch Du nur raten können und ich würde meine Zeit verschwenden.

              Was mich wirklich weiter gebracht hat hierzu, sind unabhängige Module mit eigens komplett selbst geschriebenen Klassenmethoden für tie() innerhalb meines Projekts.

              Viele Grüße,
              Horst Haselhuhn

              1. Na gut, ich versteh trotzdem nicht was du von Tie::Hash erwartest.

                Ich erwarte, dass mein Modul die Methoden erbt.

                tut es.

                Noch dazu, weil das so in der Dokumentation steht und erst recht, ..

                Nein, es ist eine abstarkete Klasse, d.h. die Methoden sind zwar da, müssen aber von dir überschrieben werden.

                Nur mal so nebenbei: Das Erbe von Tie::Array ist auch nichts wert.

                Dir ist nicht klar, was eine abstrakte Klasse ist.

                Struppi.

    2. Moin!

      require Tie::Hash;
      @Rabbit::ISA = qw(Tie::Hash);

      Vererbung so ist umständlich es gibt mehrere Module die das verienfachen. Ich benutze parent, das ist ein schnelles und einfaches Modul und es reicht dann:
      use parent 'Tie::Hash';

      Oh, bei Perl-OOP ist Vererbung kompliziert und umständlich. Prima, bei PHP ist sowas kinderleicht. Offenbar ist Perl doch nicht so supertoll, wie Hotti gerne mal behauptet.

      - Sven Rautenberg

      1. Hi!

        Vererbung so ist umständlich es gibt mehrere Module die das verienfachen. Ich benutze parent, das ist ein schnelles und einfaches Modul und es reicht dann:
        use parent 'Tie::Hash';

        Oh, bei Perl-OOP ist Vererbung kompliziert und umständlich. Prima, bei PHP ist sowas kinderleicht. Offenbar ist Perl doch nicht so supertoll, wie Hotti gerne mal behauptet.

        Das war jetzt aber gemein! Es weiß doch jeder, dass PHP /nur/ 'Perl für Kinder' ist!

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
      2. Moin!

        require Tie::Hash;
        @Rabbit::ISA = qw(Tie::Hash);

        Vererbung so ist umständlich es gibt mehrere Module die das verienfachen. Ich benutze parent, das ist ein schnelles und einfaches Modul und es reicht dann:
        use parent 'Tie::Hash';

        Oh, bei Perl-OOP ist Vererbung kompliziert und umständlich. Prima, bei PHP ist sowas kinderleicht. Offenbar ist Perl doch nicht so supertoll, wie Hotti gerne mal behauptet.

        Perl IST toll!

        Ich hab nicht geschrieben das Vererbung kompliziert und umständlich ist.

        Sie ist SO wie es hotte macht, umständlicher als wenn man ein enstsprechendes Modul benutzt. Perl ist halt flexibel, dass du dir es aussuchen kannst wie du es machen möchtest.

        Ansonsten ist mir es ziemlich egal ob PHP oder Perl, ich nutze das was für das jeweilige Einsatzgebiet für mich am sinnvollsten ist.

        Aber was OOP angeht, tut sich aber keine Sprache hervor. Bei Perl ist es halt die Liebe zur Flexibilität, d.h. du kannst (fast) alle OOP Paradigmen umsetzen wenn du willst, du kannst es aber auch lassen. Bei PHP gibt es, soweit ich das mitbekommen habe, auch noch einiges zu tun bei der Integration von OOP Fähigkeiten.

        Struppi.

        1. Hi!

          Bei PHP gibt es, soweit ich das mitbekommen habe, auch noch einiges zu tun bei der Integration von OOP Fähigkeiten.

          Was denn z.B.?

          off:PP

          --
          "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
          1. Bei PHP gibt es, soweit ich das mitbekommen habe, auch noch einiges zu tun bei der Integration von OOP Fähigkeiten.

            Was denn z.B.?

            Weiss ich nicht, ich kann kaum PHP und les nur mit, wenn hier über OOP diskutiert wurde, da kamen jedesmal Bemerkungen von Java Programmierern, dass das PHP System noch nicht ausgereift wäre. Was das im einzelnen war, hab ich nicht mehr in Erinnerung.

            Ich kann dir aber gerne die Probleme bei Perl aus Sicht von Java Programmieren aufzählen. Ich find's aber gut, dass Perl anders als Java ist.

            Struppi.

      3. Moin Sven,

        Oh, bei Perl-OOP ist Vererbung kompliziert und umständlich. Prima, bei PHP ist sowas kinderleicht. Offenbar ist Perl doch nicht so supertoll, wie Hotti gerne mal behauptet.

        Ach was, Du nicht sagst. Natürlich ist die Vererbung in Perl völlig unkompliziert, nur malso nebenbei: ich habe schon 'zig Module geschrieben, die allesamt von Exporter erben und mit @ISA = qw(Exporter); plattformunabhängig auf CentOs, Win32, SuSe-, Debian-, *Linux und sogar auf AIX laufen ;-)

        So! Schluss für heute,
        schönes Wochenende,
        Horst Blutwurst

        --
        Mist, Ascheregen. Die Isländer spinnen mal wieder.
    3. Moin,

      ich hab da ein eigenes Modul Rabbit.pm, was von Tie::Hash die Methoden erstmal alle erben soll:

      Warum? Warum verwendest du nicht einfach DB_File?

      DB_File hatte ich bisher. Das erzeugt jedoch jede Menge Overhead, haut den RAM zu und performant isses auch nicht gerade. Gestern Abend habe ich mein Modul Rabbit.pm fertiggestellt. Damit kann ich komplexe Objekte in Dateien speichern mit beliebigen benamsten Attributen und variablen Stringlängen. Auf meiner Wanderung gestern durch den Pfälzer Wald habe ich die Serialize- und Unserializefunktionen zum Speichern der Datenstrukturen gedanktlich nochmal soweit durchgespielt, dass es am Abend nur noch eine gute Stunde Tipparbeit war. Und fertig ist der Karnickel:

        
      use Rabbit;  
        
      tie my %h, 'Rabbit', 'objects.rab';  
      print $h{'/index.html'}->{title};  
        
      $h{'/map.html'}->{descr} = 'Der neue Hauptindex für die Domäne...';  
      $h{'/map.html'}->{title} = 'Sitemap';  
      untie %h; # save objects to file  
      
      

      Das geht ab wie Schmitz-Katze ;-)

      Schönen Sonntag,
      Horst Haselhuhn

      1. Das geht ab wie Schmitz-Katze ;-)

        Könntest du dazu auch einen Benchmark zeigen?
        Ich hab jahrelang DB_File benutzt und konnte mich nie über die Geschwindigkeit beklagen.

        Struppi.

        1. Das geht ab wie Schmitz-Katze ;-)

          Könntest du dazu auch einen Benchmark zeigen?

          Nicht? Schade :-(

          Struppi.

      2. Warum? Warum verwendest du nicht einfach DB_File?

        DB_File hatte ich bisher. Das erzeugt jedoch jede Menge Overhead, haut den RAM zu und performant isses auch nicht gerade.

        Nur als Ergänzung. Bis 2003 hatte ich ebenfalls so ein selbstgeschriebens Modul im Einsatz (auf Basis von DB_File). Soweit ich meine damaligen Tests bezüglich der Performance in Erinnerung habe, war DB_File völlig ok. aber ich bin dann schnell zugunsten einer Datenbank davon abgekommen.

        Struppi.

  2. Struppi und du liegt beide falsch. Tie::Hash fehlt die Methode TIEHASH schlichtweg. Benutze Tie::StdHash oder Tie::ExtraHash, wie in der Doku angegeben, dann geht es.

      
    package Rabbit;  
    use strict;  
    use warnings FATAL => 'all';  
    use Tie::Hash qw();  
    use base qw(Tie::ExtraHash);  
    1;  
      
    package main;  
    use strict;  
    use warnings FATAL => 'all';  
    use Rabbit qw();  
    tie(my %h, 'Rabbit'); # ok  
    
    

    Ich kriege immer Zahnschmerzen, wenn ich Leute immer wieder in dieselben Anfängerfallen tappen sehe. Es gibt keinen Grund, Perl zu schreiben, als ob es noch 1997 wär. Rat von mir als erfahrenem Programmierer: Objektpersistenz macht man mit mit KiokuDB.

    1. Struppi und du liegt beide falsch. Tie::Hash fehlt die Methode TIEHASH schlichtweg. Benutze Tie::StdHash oder Tie::ExtraHash, wie in der Doku angegeben, dann geht es.

      Nein liegt er nicht. Schau mal in die Zeile 198 der aktuellen Version. Es steht aber auch in der Doku, dass das Modul ein abstraktes Modul, dessen Methoden von dir implementiert werden müssen. Aber alle Methoden sind vorhanden.

      Struppi.

    2. hi,

      Ich kriege immer Zahnschmerzen,

      Ich nicht ;-)

      ... Es gibt keinen Grund, Perl zu schreiben, als ob es noch 1997 wär. Rat von mir als erfahrenem Programmierer: Objektpersistenz macht man mit mit KiokuDB.

      Mach das. Ich bleibe bei tie(). Und mit großen Hash Values komme ich auch klar, dank Referenzen, die ich an Perl schon immer sehr schätze. Seit letztem WE habe ich für mein Objektmanagement auf dem Webserver gleich zwei Module (Rabbit und HashFile) geschrieben, die unabhängig sind aber hervorragend zusammenspielen.

      Dazu gehört eine Eigenentwicklung für Serialize/Unserialize von Objekten (Rabbit.pm) und Hashes (HashFile.pm) in Binärdateien. Rabbit ist für die Attribute und HashFile für den Content der URLs.

      Das Ganze ist seit heute abend online und dermaßen performant, RAM-gefällig und CPU-compliant geworden, dass ich am liebsten die ganze Nacht auf meiner eigenen Seite rumklicken könnte bis mich der Schlaf überwältigt.

      Perl ist einfach nur geil!!!!11!

      Horst Haselhuhn

      --
      Zähne beim Putzen festhalten. Dann fliegen sie auch nicht weg.