http://www.perlmonks.org?node_id=222368


in reply to Re: modify @INC
in thread modify @INC

lib will take a variable. You just have to initialize that in a BEGIN block beforehand. This is Perl - compilation and execution are freely nestable.

Makeshifts last the longest.

Replies are listed 'Best First'.
Re: Re^2: modify @INC
by Anonymous Monk on Jan 16, 2003 at 23:46 UTC
    Would it be an option to do something like:

    $a="/my/module/path"; eval "use lib '$a'"; eval { use MyModule; }
    I recall once using eval & use together to dynamically load specific modules when needed... This was before I knew about AUTOLOAD and SelfLoader and all...
      No, that won't work. The use inside the eval BLOCK is compiled at compile time, but the string in eval EXPR is not. eval "use Foo"; is nothing but an obfuscated way to say require Foo; Foo->import;

      Neither case is a job for eval here. If you want variable paths at compile time, you do the following:

      my $libpath; BEGIN { $libpath = "/foo/bar"; } use lib $libpath;
      If you want to load modules with dynamic @INC at runtime, you make use of the aforemention construct:
      { local @INC = ("/foo/bar", @INC); require Foo; Foo->import; }
      eval will not help. And $a is a really awful name for a variable (plus $a and $b are reserved for sort). :)

      Makeshifts last the longest.

Re: Re^2: modify @INC
by mt2k (Hermit) on Dec 26, 2002 at 17:40 UTC
    Mmm... I just ran a test script and got a working version, but I can't get it to not display warning messages.

    BEGIN { my $a = "c:/"; use lib "$a"; } use GetWords; print new GetWords;

    The warning message (without -w swicth or 'use warnings'):

    Empty compile time value given to use lib at C:\Documents and Settings\mt2k\De sktop\testing.pl line 3

    -------------------------------------
    eval reverse@{[lreP
    =>q{ tsuJ\{qq},' rehtonA'
    ,q{\}rekcaH },' tnirp']}[1+1+
    1,1-1,1+1,1*1,(1+1)*(1+1)];
    -------------------------------------
    
      Mm?
      my $somewhere; BEGIN { $somewhere = q(/over/the/rainbow) } use lib $somewhere;

      Makeshifts last the longest.

      Oh yeah.. that's funny. Get this - right as soon as the implicit BEGIN (via the use) is parsed inside the currently-being-parsed BEGIN block it is executed. So you're attempting to use $a in your nested BEGIN block prior to defining it. See?

      BEGIN { my $a = "c:/"; BEGIN { require "$a"; import "$a"; } }

      Fun Fun Fun in the Fluffy Chair