welche Stolperfalle habe ich übersehen (perl und Objekte)?

  • Hallo,


    ich experimentiere gerade an einem Skript um meine VDR-Aufnahmen zu sichern.
    Den spumux-Fehler habe ich auch gefunden und die Tests waren viel versprechend.


    Jetzt wollte, bzw. habe ich den Code etwas aufgeräumt und neu strukturiert und jetzt klappt es nich mehr.


    Das Image::Magick-Modul bemüht ja die OO-Syntax und in erster Unterprogramm-Ebene funktionieren die Aufrufe wie gewünscht. Durch die Neustrukturierung bin ich jetzt in 2. oder 3. Verschachtelungstiefe und da kommt eine Exception, dass die Methoden der Klasse nicht mehr bekannt sind:

    Code
    Exception 410: no images defined `Resize' at ./test.pl line 144.
    Can't locate object method "Composite" via package "Exception 410: no images defined `Image::Magick'" (perhaps you forgot to load "Exception 410: no images defined `Image::Magick'"?) at ./test.pl line 146.


    Hm, da bin ich jetzt mehr als radlos.
    Klar sind alle Variablen mit my(...) deklariert, aber das sollte ja trotzdem funktionieren. - Oder?


    Bin für jede Erleuchtung dankbar!

    Ich bin verantwortlich für das, was ich schreibe, nicht für das, was Du verstehst!


  • Also dann werd ich dir mal was leuchten ;) Du rufst auf einem String eine Methode auf. Das kann natürlich nicht funktionieren ;)


    Hier ein kleines Beispiel, wie sowas passieren kann:



    Ich habe in der Eile des Gefechts, die Positionen bei 'Schleichender Bug ...' vertauscht. Jetzt versucht Perl bei einem String eine Methode aufzurufen und knallt weg ...


    Ich kann leider nur meine Glaskugel rausholen, da du ja den Code nicht mit geliefert hast. Ich denke mal du hast folgendes gemacht:


    my $module = Image::Magick->methode($pictures);
    Diese liefert aber statt einem Objekt eine Fehlermeldung zurück weil ihr die $pictures nicht gefallen. Du rufst sofort eine Methode $module->Composite auf und perl knallt weg.


    Also ein Tipp von mir, wenn du in einem Objekt eine Methode aufrufst MUSST du immer eine Fehlerbehandlung mit einbauen. Dann kommste auch nicht durcheinander:


    Code
    my $ergebniss = $module->Resize($bild) 
        or return error($module->Error);


    Halt nach dem Prinzip, "Ich bekomme immer ein (positives) Ergebniss zurück! Falls nicht MUSS ein Fehler passiert sein."


    Das erspart dir eine Menge Suchen nach Fehlern ;)


    P.S.: BITTE schicke nächstes Mal deinen Sourcecode mit, sonst können wir dir kaum helfen.

  • Hi xpix,


    danke für Deine Aufmerksamkeit und die ausführliche Antwort.
    Ich muss gestehen, so ganz habe ich Deine Antwort nicht verstanden, aber sie hat mich ein kleines Stückchen weiter gebracht.


    Jetzt hänge ich an einem segfault, den ich nicht verstehe.


    Damit Du Deine Glaskugel nicht zu sehr strapazieren musst, lege ich das script mal bei.


    Falls Du es ausprobieren möchtest:

    • Verzeichnis test anlegen
    • Einen Arbeitsauftrag anlegen:
      z.B. mit find /video0 -name index.vdr -print > rec.lst


      Die Datei dann editieren, sodass folgender Zeilenaufbau entsteht:
      Titel der Scheibe, Hintergrundbild, Farbname (ala Imagemagick), Aufnahme1, ..., Aufnahme[n]
      Die Dateien noch entfernen, z.B. mit vi 1,$s/\/index.vdr//g

    • Aufruf des scriptes mit dem Arbeitsauftrag als Parameter

    Freue mich über jede Unterstützung.

  • Hallo zusammen,


    wollte nur Bescheid sagen, dass ich den Fehler mittels debuggen lokalisieren konnte.
    Weiß zwar noch nicht, was falsch war, aber ich konnte den code so ändern, dass es jetzt wieder tuht :)


    Dank an jeden, der sich die Mühe machte, sich mit meinem Problem zu beschäftigen.

    Ich bin verantwortlich für das, was ich schreibe, nicht für das, was Du verstehst!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!