Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

modify @INC

by pfm (Scribe)
on Dec 04, 2002 at 09:29 UTC ( [id://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

   4: 

   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

   8: 

   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+
    1,1-1,1+1,1*1,(1+1)*(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\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)];
        -------------------------------------
        

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (5)
As of 2025-05-23 15:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.