Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

modify @INC

by pfm (Scribe)
on Dec 04, 2002 at 09:29 UTC ( #217438=perlcraft: print w/replies, xml ) Need Help??

   1: # I didn't know about the node 104334

   2: # when this came to my mind

   3: # I think it is interesting


   5: $dot = pop @INC;         # a dot marks the end of @INC

   6: push @INC, $your_path;   # so you add you path

   7: push @INC, $dot;         # and put it back


   9: use AnythingFromThePath; # and use your stuff

Replies are listed 'Best First'.
•Re: modify @INC
by merlyn (Sage) on Dec 04, 2002 at 15:33 UTC
    Beware. Dot is not at the end of @INC if you're running as root, so you just inserted your directory at some arbitrary place in the middle.

    If you don't want dot, remove it:

    @INC = grep { $_ ne "." } @INC, $your_path;

    -- Randal L. Schwartz, Perl hacker
    Be sure to read my standard disclaimer if this is a reply.

Re: modify @INC
by mt2k (Hermit) on Dec 26, 2002 at 03:50 UTC
    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+
      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...
        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\ line 3

        eval reverse@{[lreP
        =>q{ tsuJ\{qq},' rehtonA'
        ,q{\}rekcaH },' tnirp']}[1+1+

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlcraft [id://217438]
Approved by blakem
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (2)
As of 2022-09-25 17:20 GMT
Find Nodes?
    Voting Booth?
    I prefer my indexes to start at:

    Results (116 votes). Check out past polls.