http://qs321.pair.com?node_id=222277


in reply to modify @INC

BTW, if all you want to do is add another directory for including modules in your code, use the 'use lib' directive instead. Rather than adding a directory to @INC as you have done, do this:

use lib '/home/user/directory';
Now of course, your example uses a variable to add to @INC rather than a string. 'use lib' will not take a variable since it's done during the compile stage. And why remove the last entry (the dot) from the list in the first place? You can just push @INC, $your_path right off the bat. Unless you for some reason require that perl search your directory before the current one for modules. Though I suppose the current directory should be checked as a last resort :) Maybe I'll quiet down...
-------------------------------------
eval reverse@{[lreP
=>q{ tsuJ\{qq},' rehtonA'
,q{\}rekcaH },' tnirp']}[1+1+
1,1-1,1+1,1*1,(1+1)*(1+1)];
-------------------------------------

Replies are listed 'Best First'.
Re^2: modify @INC
by Aristotle (Chancellor) on Dec 26, 2002 at 17:17 UTC
    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.

      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.

      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