Juel: Paketname variabel einbinden

Hi,

ich würde gerne alle in einem Verzeichnis befindlichen Module mit
use $paketname; einbinden. Die Namen der Module sind dabei natürlich variabel.

Habe es jetzt entsprechend diesem Beitrag (http://forum.de.selfhtml.org/archiv/2005/11/t119050/)
mit

use &{$module}; und
use eval("${module}"); und
use $$module;

versucht, aber leider komme ich damit nicht weiter :(
Hat jemand evtl. eine Idee wie man das Problem noch lösen könnte ohne alle Module per Hand zu laden ?

Vielen Dank für alle Tipps, Juel

  1. ich würde gerne alle in einem Verzeichnis befindlichen Module mit
    use $paketname; einbinden. Die Namen der Module sind dabei natürlich variabel.

    Das geht nicht. Du kannst nicht alle Module mit einem use Befehl einbinden.

    versucht, aber leider komme ich damit nicht weiter :(
    Hat jemand evtl. eine Idee wie man das Problem noch lösen könnte ohne alle Module per Hand zu laden ?

    Warum möchtest du das?
    Eigentlich möchte man Module nur einbinden, wenn man sie wirklich braucht, zur Laufzeit kann man auch mit require einbinden. Aber deine Wunsch hört sich erstmal merkwürdig an.

    Struppi.

    1. Hi,
      sorry da hab ich mich falsch ausgedrückt, ich möchte nicht alle mit einem use-Befehl einbinden, sondern habe mir ein Script geschrieben, das liest aus einem Modulverzeichnis in dem seltgeschriebene Module liegen die Namen aus.
      Dann sollen diese in einer Schleife dynamisch entsprechend ihres Namens eingebunden werden.

      Der Grund dafür, die einzelnen Module beinhalten JS/Html/Ajax-Code einer modularen Website, d.h. möchte ich auf der Website ein bestimmtes Feature einbinden kopiere ich mir die entsprechende Modul.pm in mein Modulverzeichnis. Das wir dann automatisch geladen, und schreibt mir z.B. in mein basis.js den Code den es braucht wenn es verwendet wird.

      Was mir eben eingefallen ist, ich könnte mir die einzelnen use xxxx.pm Befehle in einer Datei herausschreiben und die dann einbinden, allerdings wäre das wohl der unschönste Weg den man nehmen könnte...

      1. Der Grund dafür, die einzelnen Module beinhalten JS/Html/Ajax-Code einer modularen Website, d.h. möchte ich auf der Website ein bestimmtes Feature einbinden kopiere ich mir die entsprechende Modul.pm in mein Modulverzeichnis. Das wir dann automatisch geladen, und schreibt mir z.B. in mein basis.js den Code den es braucht wenn es verwendet wird.

        Mal abgesehen davon, dass ich bezweifle dass das so der beste Weg ist, was hälst du von require?

        Struppi.

        1. Hi, welchen Weg würdest du denn alternativ vorschlagen ?
          Alles per Hand ins basis.js einzutragen hab ich damit zumindest mal vermieden.

          Hätte aber trotzdem großes Intersse daran wie man eine modulare Website mit perl und ajax am sinnvollsten programmiert.

          1. Hi, welchen Weg würdest du denn alternativ vorschlagen ?
            Alles per Hand ins basis.js einzutragen hab ich damit zumindest mal vermieden.

            Naja, man müßte dazu mehr Wissen. Aber so wie du es beschreibst klingt es eher danach, als ob du ein Template System verwenden möchtest, z.b. HTML::Template oder Template::Toolkit.

            Struppi.

      2. Habe eine Möglichkeit gefunden,

        require $module; funktioniert - warum das ganze mit use $module;
        nicht auch geht - keine Ahnung...

        @Struppi Trotzdem vielen Dank für die Hilfe!

        1. Hi

          require $module; funktioniert - warum das ganze mit use $module;
          nicht auch geht - keine Ahnung...

          du solltest es in einen BEGIN-block mit "use" machen!

          solche tiefgehenden Fragen lieber bei http://board.perl-community.de/board/10/ stellen

          cheers
            LanX

          1. nachtrag:

            für solche dinge gibts fertige Module auf CPAN, schau mal nach Autoloader und ähnlichem

          2. require $module; funktioniert - warum das ganze mit use $module;
            nicht auch geht - keine Ahnung...

            du solltest es in einen BEGIN-block mit "use" machen!

            Naja, das ginge nur in Ausnahmefällen, wenn die Variabel $module schon frühzeitig bekannt wäre. Trotzdem bräuchte er dann eval.

            Struppi.

            1. Hi

              du solltest es in einen BEGIN-block mit "use" machen!

              Naja, das ginge nur in Ausnahmefällen, wenn die Variabel $module schon frühzeitig bekannt wäre. Trotzdem bräuchte er dann eval.

              $modul ergibt sich bei ihm aus seiner Directorysuche.

              und Begin-Blocks sind AFAIR eigentlich evals.

              Cheers
                LanX

              1. du solltest es in einen BEGIN-block mit "use" machen!

                Naja, das ginge nur in Ausnahmefällen, wenn die Variabel $module schon frühzeitig bekannt wäre. Trotzdem bräuchte er dann eval.

                $modul ergibt sich bei ihm aus seiner Directorysuche.

                Das kann jederzeit während der Laufzeit stattfinden.

                und Begin-Blocks sind AFAIR eigentlich evals.

                Das ist Unsinn.

                Und:

                #!/usr/bin/perl  
                use warnings;  
                use strict;  
                  
                BEGIN {  
                my $modul = 'x';  
                use $modul;  
                }  
                
                

                ergibt:
                syntax error at ..\test.pl line 7, near "use $modul"
                Execution of ..\test.pl aborted due to compilation errors.

                Struppi.

                1. Das ist Unsinn.

                  nö soweit ich mich _erinnere_ steht folgendes in der Doku

                  "It should be noted that "BEGIN" code blocks are executed inside string
                  "eval()"’s.  The "CHECK" and "INIT" code blocks are not executed inside
                  a string eval, which e.g. can be a problem in a mod_perl environment.

                  und tschüss
                    LanX

                2. du solltest es in einen BEGIN-block mit "use" machen!

                  Naja, das ginge nur in Ausnahmefällen,

                  um die Sache zu verkürzen, der OP wollte:

                  BEGIN {  
                      @files= <*.pm>;  
                      for $f (@files) {  
                          $f=~s/\.pm//;  
                          print "Modul '$f' wird eingebunden\n";  
                          eval "use $f";  
                      }  
                  }  
                  
                  
                  1. du solltest es in einen BEGIN-block mit "use" machen!

                    Naja, das ginge nur in Ausnahmefällen,

                    um die Sache zu verkürzen, der OP wollte:

                    BEGIN {

                    @files= <*.pm>;
                        for $f (@files) {
                            $f=~s/.pm//;
                            print "Modul '$f' wird eingebunden\n";
                            eval "use $f";
                        }
                    }

                      
                    Ich sag doch du brauchst eval. Aber mit require könntest du dir das sparen, ebenso wie das ersetzten der Dateinendung und alle Module müssen im gleichen Verzeichniss wie das Skript sein, was eher selten der Fall sein sollte.  
                      
                    Struppi.
                    
                    1. hi

                      Ich sag doch du brauchst eval. Aber mit require könntest du dir das sparen, ebenso wie das ersetzten der Dateinendung und alle Module müssen im gleichen Verzeichniss wie das Skript sein, was eher selten der Fall sein sollte.

                      use heißt require plus import, und importieren sollte man im Allg. möglichst vorm compilieren.

                      das es ge"eval"t werden muss hab ich nicht abgtestritten.

                      Bye
                       LanX

                      1. Ich sag doch du brauchst eval. Aber mit require könntest du dir das sparen, ebenso wie das ersetzten der Dateinendung und alle Module müssen im gleichen Verzeichniss wie das Skript sein, was eher selten der Fall sein sollte.

                        use heißt require plus import, und importieren sollte man im Allg. möglichst vorm compilieren.

                        Spekulationen über Spekulationen. Ich finde es besser Ratschläge zu geben die sinnvoll sind, als unnötige Umsetzungen, die im konkreten Fall u.U. gar nicht erfoderlich sind.

                        das es ge"eval"t werden muss hab ich nicht abgtestritten.

                        Doch hast du. Zumindest klingt das so.

                        Struppi.