in reply to Using modules with relative paths

Something that could work would be:

BEGIN { use File::Spec::Functions qw(rel2abs); use File::Basename; my $homedir = dirname(rel2abs($0)); # let's hope that the homedir is something sane and dosen't # contain curly braces: eval "use lib q{$homedir};"; die $@ if $@; };
perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web

Replies are listed 'Best First'.
Re: Re: Using modules with relative paths
by theorbtwo (Prior) on Oct 24, 2003 at 10:58 UTC

    Good answer, but one slight modification. The eval around the use line is unneccessary. It would be needed if you were tying to make the "lib" bit dynamic, but the arguments to a module are just a normal perl expression, and can include evaluation. Simply use lib $homedir;. (This also removes the need to die $@ if $@, of course.)


    Warning: Unless otherwise stated, code is untested. Do not use without understanding. Code is posted in the hopes it is useful, but without warranty. All copyrights are relinquished into the public domain unless otherwise stated. I am not an angel. I am capable of error, and err on a fairly regular basis. If I made a mistake, please let me know (such as by replying to this node).

      Hmm - on this machine, with this perl, your suggestion does not work, and I think it does not work while used in the same block, as use is a compile time thing:

      Q:\>perl -v This is perl, v5.6.1 built for MSWin32-x86-multi-thread (with 1 registered patch, see perl -V for more detail) (snip-snap) Q:\>perl -e "$foo='bar'; use lib $foo; die join ';',@INC" Empty compile time value given to use lib at -e line 1 ;s:/Os/OSP/OSPI/Perl/lib;s:/Os/OSP/OSPI/Perl/site/lib;. at -e line 1. Q:\>perl -e "BEGIN{$foo='bar'; use lib $foo;} die join ';',@INC" Empty compile time value given to use lib at -e line 1 ;s:/Os/OSP/OSPI/Perl/lib;s:/Os/OSP/OSPI/Perl/site/lib;. at -e line 1. Q:\>perl -e "BEGIN{$foo='bar';} use lib $foo; die join ';',@INC" bar;s:/Os/OSP/OSPI/Perl/lib;s:/Os/OSP/OSPI/Perl/site/lib;. at -e line +1. Q:\>perl -e "BEGIN{my $foo='bar'; eval qq{use lib $foo;}};die join ':' +,@INC" bar:s:/Os/OSP/OSPI/Perl/lib:s:/Os/OSP/OSPI/Perl/site/lib:. at -e line +1.
      perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web
        Try require and import rather than use for run time inclusion of modules.

        rdfield

Re: Re: Using modules with relative paths
by Hena (Friar) on Oct 24, 2003 at 14:15 UTC
    Yesh!

    This way it works. I could even add a the s/// to go down in path (eg. from "/work/programs/bin" -> "/work/programs". Thanks a lot :).