Stefan Welscher: "use" dynamisch verwenden?

Hallo liebe Community,

ich habe ein Script das Konfigurationen erzeugen soll.
Für jedes Projekt gibt es dabei ein Input-Modul und ein Output-Modul (evtl. noch benötigte Zusatzmodule...).
Damit ich jetzt nicht bei jeden Scriptaufruf rießige Listen an Modulen laden muss würde ich gerne nur die für das Projekt benötigten Module laden.

Allerdings scheint PERL mit "use $modul[$i];" nicht klarzukommen (Syntax Error).

Darum meine Frage an euch.... :
Wie kann ich das realisieren?

Vielen Dank,
Stefan

  1. Allerdings scheint PERL mit "use $modul[$i];" nicht klarzukommen (Syntax Error).

    Darum meine Frage an euch.... :
    Wie kann ich das realisieren?

    mit require oder eval() kommt ganz darauf an.

    Struppi.

    1. Allerdings scheint PERL mit "use $modul[$i];" nicht klarzukommen (Syntax Error).

      Darum meine Frage an euch.... :
      Wie kann ich das realisieren?

      mit require oder eval() kommt ganz darauf an.

      Struppi.

      Hallo und zunächst Danke...
      Allerdings funktioniert das mir require nicht so ganz, wie ich mir das vorgestellt habe (vereinfachte Darstellung):

      Hauptdatei:

      use strict;

      use lib "/home/mydir/lib/";
      use IP_tool;
      use Convert;

      $add_module="input.pm";
      require $add_module;

      $input=&read_input("foo","bar");
      $input=&convert_data($input);

      print $input;

      input.pm:

      package input;

      use Exporter;
      @ISA=('Exporter');
      @Export=qw( &read_input );

      sub read_input
      {
      ...
      }

      Convert.pm:

      package Convert;

      use Exporter;
      @ISA=('Exporter');
      @Export=qw( &convert_data );

      sub convert_data
      {
      ...
      }

      "convert_data" kann ich problemlos aufrufen, allerdings findet das Programm "&main::read_input" nicht...

      1. Hallo,

        "convert_data" kann ich problemlos aufrufen, allerdings findet das Programm "&main::read_input" nicht...

        perldoc -f use:

        imports some semantics into the current package from the named module, generally by aliasing certain subroutine or variable names into your package. It is exactly equivalent to

        BEGIN { require Module; import Module LIST; }

        except that Module must be a bareword.....

        Also der Rest sollte klar sein, oder?

        Grüße
          Klaus

        1. Also der Rest sollte klar sein, oder?

          Müsste wohl... ist aber nicht....
          Das mit dem BEGIN hab ich auch schon gelesen und probiert und wenn ich die Fehlermeldung von PERL richtig verstehe bedeutet das, dass PERL versucht den Code ganz am Anfang auszuführen.
          Warum dann allerdings require keinen Exporter unterstützt verstehe ich trotzdem nicht.... Bin aber auch kein Informatikstudent, sondern nur gelernter IT-Systemelektroniker, deshalb glaube ich macht das nix aus :D
          Für solche Sachen muss ich euch eben belästigen... ;)

      2. Hallo und zunächst Danke...
        Allerdings funktioniert das mir require nicht so ganz, wie ich mir das vorgestellt habe (vereinfachte Darstellung):

        Dachte ich mir schon, das ist alles ein bisschen Tricky, die eval Lösung dürfte dir am besten gefallen.

        Ich würd allerdings deinen Ansatz anders angehen.

        Hauptdatei:

        use strict;

        use lib "/home/mydir/lib/";
        use IP_tool;
        use Convert;

        $add_module="input.pm";
        require $add_module;

        $input=&read_input("foo","bar");

        Wenn du die Funktion im Package läßt und nicht exportierst ginge das:

          
        use strict;  
          
        use lib "/home/mydir/lib/";  
        use IP_tool;  
        use Convert;  
          
        $add_module="input.pm";  
        require $add_module;  
          
        $input = input::read("foo","bar");  
        ..  
          
        input.pm:  
        ==========  
        package input;  
          
        sub read  
        {  
        ...  
        }  
        
        

        Die & Zeichen sind hier überflüssig (sie haben unter bestimmten Bedingungen eine spezielle Funktion).

        So musst du nicht den Namensraum "verschmutzen" und erkennst klar woher die Funktion kommt. Hat aber den Nachteil, dass Tippfehler im Funktionsnamen erst zur Laufzeit festgestellt werden.

        Struppi.

  2. Hallo,

    ich mach das mit

    eval("use modules::" . $modulename);
    die("could not find modules " . $modulename) if $@ ne "";

    und das klappt wunderbar.

    Cruz

    1. Hallo,

      ich mach das mit

      eval("use modules::" . $modulename);
      die("could not find modules " . $modulename) if $@ ne "";

      und das klappt wunderbar.

      Cruz

      :lol: :daumen:
      Das  gefällt mir!
      Ich bin jetzt leider nicht mehr auf der Arbeit um das ausprobieren zu können, aber ich versuch das Morgen auf jeden Fall mal....

      Danke!

    2. Hallo,

      ich mach das mit

      eval("use modules::" . $modulename);
      die("could not find modules " . $modulename) if $@ ne "";

      und das klappt wunderbar.

      Cruz

      Klappt wunderbar!!
      Danke!!