MichaelB: Wie setzt man die @INC

Hallo allerseits,

ich bekomme hier an meinem Rechner (Redhat Linux 7.3) ständig die Fehlermeldung bei der Ausführung eines Perl-Skriptes, dass die MD5.pm nicht gefunden werden kann ("Can't locate MD5.pm in @INC "). Die Datei ist zwar vorhanden aber der Pfad fehlt in der @INC.
Gibt es eine Möglichkeit diese global irgendwie zu beeinflussen ohne den Pfad im Skript oder via Kommandozeile übergeben zu müssen.
Wenn man ein Perlskript aufruft, sind ja schon Pfade in dieser "Variable" enthalten. Und irgendwo müssen die ja herkommen. Woe genau sind sie definiert?

Danke im voraus

Gruss
   MichaelB

  1. Hallo allerseits,

    ich bekomme hier an meinem Rechner (Redhat Linux 7.3) ständig die Fehlermeldung bei der Ausführung eines Perl-Skriptes, dass die MD5.pm nicht gefunden werden kann ("Can't locate MD5.pm in @INC "). Die Datei ist zwar vorhanden aber der Pfad fehlt in der @INC.
    Gibt es eine Möglichkeit diese global irgendwie zu beeinflussen ohne den Pfad im Skript oder via Kommandozeile übergeben zu müssen.
    Wenn man ein Perlskript aufruft, sind ja schon Pfade in dieser "Variable" enthalten. Und irgendwo müssen die ja herkommen. Woe genau sind sie definiert?

    Du kannst mit dem Befehl "use lib" in Deinem Script beliebige Verzeichnisse für aufzurufende Module definieren. Lies http://www.perldoc.com/perl5.6.1/lib/lib.html

    Viel Spass!
    Richard

    Danke im voraus

    Gruss
       MichaelB

    1. Hallo,

      Du kannst mit dem Befehl "use lib" in Deinem Script beliebige Verzeichnisse für aufzurufende Module definieren. Lies http://www.perldoc.com/perl5.6.1/lib/lib.html

      Ja .... das weiß ich ja. Aber das will ich ja gerade nicht.

      Trotzdem Danke für die Antwort.

      Gruss
         MichaelB

      1. use Mosche;

        Du kannst mit dem Befehl "use lib" in Deinem Script beliebige Verzeichnisse für aufzurufende Module definieren. Lies http://www.perldoc.com/perl5.6.1/lib/lib.html

        Ja .... das weiß ich ja. Aber das will ich ja gerade nicht.

        Hier mal die technische Seite:

        Module, die per 'use' eingebunden werden, werden gleich zur "Kompilierungsphase" ausgeführt, also nicht an der Stelle, an der das ganze eingebunden wird. Folgende Ausschnitte sind also gleich:

        #####1#####
        use Module;
        print $Module::blah;

        #####2#####
        print $Module::blah;
        use Module;

        Das heisst, du kannst nicht per
        push(@INC, ...);
        @INC setzen, weil dies erst nach dem Kompilieren geschehen würde (zu einem Zeitpunkt, wo die Fehlermeldung schon "draussen" ist). Du hast nun mehrere Wege:

        1. Benutze statt "use" "require" inklusive aller Risiken und Nebenwirkungen.
        2. Setze einen BEGIN-Block und führe dort den Push aus (das muss vor dem "use Module" sein, denn dass wird dann wiederum hintereinander ausgeführt.
        3. Benutze "use lib;" - das ist im Grunde das gleiche wie 2), nur sicherer/besser.

        use Tschoe qw(Matti);

  2. Hallo,

    ich bekomme hier an meinem Rechner (Redhat Linux 7.3) ständig die Fehlermeldung bei der Ausführung eines Perl-Skriptes, dass die MD5.pm nicht gefunden werden kann ("Can't locate MD5.pm in @INC "). Die Datei ist zwar vorhanden aber der Pfad fehlt in der @INC.

    DAnn dürfte das Modul nicht so installiert worden sein, wie es an anund für sich bei Perl vorgesehen wurde. Vielleicht würde auch die Lektüre von perlmodinstall helfen.

    Gibt es eine Möglichkeit diese global irgendwie zu beeinflussen ohne den Pfad im Skript oder via Kommandozeile übergeben zu müssen.

    Naja eine Variante wüßte ich schon, die ist aber nicht gerade die feine Art. Also : 'kids, don't try this at home'

    #!/path/to/perl

    BEGIN
    {
    push @INC,split(':',$ENV{'MY_PERL_INCLUDE'});
    }

    use whatever::modules;

    Die Zusätzlichen Perl-Pfade kannst Du dann ja in der Environmentvariable 'MY_PERL_INCLUDE' ablegen.

    Wenn man ein Perlskript aufruft, sind ja schon Pfade in dieser "Variable" enthalten. Und irgendwo müssen die ja herkommen. Woe genau sind sie definiert?

    AFAIK werden die Standardpfade bereits beim Kompilieren festgelegt. Allerdings, wenn Du Perl neu kompilieren könntest, dann könntest Du auch die Module gleich in die richtigen Pfade ablegen, was Dir diesen Streß hier ersparen würde.

    Grüße
      Klaus