Anzeige:
Ergebnis 1 bis 7 von 7

Thema: [Perl] Dynamisches Einbinden von Bibliotheken in einem Namensraum

  1. #1
    Registrierter Benutzer Avatar von Rebell
    Registriert seit
    10.07.2002
    Ort
    Dresden
    Beiträge
    62

    [Perl] Dynamisches Einbinden von Bibliotheken in einem Namensraum

    Hallo ihr.

    Ich versuche seit einiger Zeit (verzweifelt) in ein objektorientiertes Perl-Programm dynamisch Funktionen nachzuladen.

    Leider habe ich zwei Probleme:
    a) Das Einbinden von require funktioniert nur bedingt. Wenn ich Bibliotheken via "require" einladen lasse, befinden diese sich nur im Namensraum der jeweiligen einbindenen Klasse.
    Wenn also die Klasse "Haupt" das require verwendet, kann ich die Funktionen nicht in der Klasse "Neben" aufrufen. Ein Aufruf mittels "&Haupt::funktion()" klappt zwar, aber nur bedingt, da ich defined(Haupt::funktion()) darauf nicht anwenden kann (ich muss wissen ob die Funktion vorhanden ist).

    b) Mit use schaffe ich es nicht, dynamische Pfade anzugeben.
    Code:
    $pfad = "libs/meine_lib.pm";
    use $pfad;
    Klappt nicht.


    Gibt es eine andere Möglichkeit den Vorteil von use (precompiling) und require (dynamik) miteinander zu kombinieren, oder ist das was ich versuche grundsätzlich schlecht?

    Ich hatte auch noch eine andere Methode vorgesehen:
    c) Ich lade meine Bibliotheken nicht dynamisch, sondern im Hauptprogramm via use. Dann habe ich aber das Problem, dass mir auch dieser Namensraum unbekannt ist. Ein Aufruf aus der Klasse "Neben" mit "&Main::funktion()" schielt ins Leere.


    Irgendwelche Ideen?
    to be famous is so nice
    http://get-mike.de
    M:ke

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.02.2006
    Beiträge
    116
    Code:
    #!/usr/bin/perl
    
    my $module = 'Test::Module';
    
    if($INC{$module}){
        print "$module is loaded\n";
    }
    
    
    eval{
        "use $module";
    };
    
    if($@){
        print "Could not load $module!\n";
    }
    
    
    if($INC{$module}){
        print "$module is loaded\n";
    }

  3. #3
    Registrierter Benutzer Avatar von Rebell
    Registriert seit
    10.07.2002
    Ort
    Dresden
    Beiträge
    62
    Na klar, eval kann ich doch nehmen... klar... Danke
    Aber ist das nicht unelegant?
    to be famous is so nice
    http://get-mike.de
    M:ke

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    Hmm, wie wäre es, wenn du das require weiterhin benutzt und mit Referenzen auf die geladenen Funktionen arbeitest? Brauchst halt ne Methode in deiner Klasse haben die das verwaltet und a) via beliebigen Identifizierer die gewünschte Funktion aufruft und deren Return-Wert weiter gibt oder b) die Referenz zurück gibt, damit auch aus nem anderen Namensraum drauf zugreifen kannst.

    Vorteil wäre auch, dass du Fehler wegen falscher Module bzw. fehlender Funktionen so besser abfangen könntest und die entsprechenden Module evtl., wenn du sie irgendwie in deinem Program "registrierst" (also weisst was wo drin ist) auch nur genau dann laden musst wenn du sie brauchst.

    Kompliziert wirds IMHO wenn du gar nicht weisst was in den Modulen drin ist, weiss nicht ob man das zu Laufzeit so einfach auslesen kann (ausser in dem man die Modul-Datei parst, was aber eher "dirty" ist)...
    Geändert von sticky bit (11-10-2006 um 19:15 Uhr) Grund: Sag mir wo die Newlines sind, wo sind sie geblieben?
    chmod -R +t /*

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.02.2006
    Beiträge
    116
    Ein Block-eval ist ok. Fehlende Module werfen einen Fehler und die Fehlermeldung landet in $@.

    Das ist eine saubere Sache...

  6. #6
    Registrierter Benutzer Avatar von Rebell
    Registriert seit
    10.07.2002
    Ort
    Dresden
    Beiträge
    62
    Ähm. Noch ein "Problem":
    Code:
    eval {
    	"use $module";
    };
    if (defined(&bp_test)) {
    	print "definiert<br>";
    } else {
    	print "funktion nicht definiert (bp_test)<br>";
    }
    Funktioniert bei mir nicht.
    Zitat Zitat von Ausgabe
    funktion nicht definiert (bp_test)
    Aber
    Code:
    eval ("use $module");
    Zitat Zitat von Ausgabe
    definiert
    funktioniert sehr wohl. Warum?
    to be famous is so nice
    http://get-mike.de
    M:ke

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    Schätze mal, weil "use $module"; einfach nur ein Ausdruck ist, der aber nichts macht. Ist zwar gültige Syntax aber sinnlos. Und du gibst dem eval ja den Block, also wird da nichts interpoliert vorher oder so, sondern das einfach so genommen wies ist. Wenn du irgendwo anders in deinen Code "use $module"; schreibst wird dort auch nichts passieren.
    Bei eval("use $modul"); hingegen gibst du dem eval einen Ausdruck der vorher ausgewertet wird.
    chmod -R +t /*

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •