Resove the problem of @INC of perl.
来源:互联网 发布:vb.net web应用程序 编辑:程序博客网 时间:2024/06/07 09:55
Default
@INC
Perl interpreter is compiled with a specific default value of
@INC
that it was compiled with. To find out this value, runenv -i perl -V
command (`env -i ignores PERL5LIB environmental variable - see #2) and in the output you will see something like this:$ perl -V...%ENV: PERL5LIB="/home/myuser/test"@INC: /home/myuser/test /usr/local/lib/perl5/5.8.6/i686-linux /usr/local/lib/perl5/5.8.6 /usr/local/lib/perl5/site_perl/5.8.6/i686-linux /usr/local/lib/perl5/site_perl
-I
command line parameterPerl pre-pends
@INC
with a list of directories (colon-separated) passed in to it as a value of-I
command line parameter. This can be done in one of two ways, as usual with Perl parameters:Pass it on command line:
perl -I /my/moduledir your_script.pl
Pass it via the first (shebang) line of your Perl script:
#!/usr/local/bin/perl -w -I /my/moduledir
- Pass it as part of
PERL5OPT
(orPERLOPT
) environmantal variable (see chapter 19.02 in Programming Perl)
Pass it via the
use lib
pragmaPerl pre-pends
@INC
with a list of directories passed in to it viause lib
pragma.
In a program:
use lib ("/dir1", "/dir2")
On the command line:
perl -Mlib=/dir1,/dir2
You can also remove the directories from
@INC
viano lib
You can directly manipulate
@INC
as a regular Perl array.NOTE: Since
@INC
us used during compilation phase, this must be done inside of aBEGIN {}
block, which precedes theuse MyModule
statement;Add directories to the beginning via
unshift @INC, $dir
Add directories to the end via
push @INC, $dir
Do anything else you can do with a Perl array.
NOTE The directories are unshifted onto @INC in the order listed in this answer, e.g. default @INC is last in the list, preceded by PERL5LIB, preceded by -I, preceded by "use lib" and direct @INC manipulation, the latter two mixed in whichever order they are in Perl code.
We will look at how the contents of this array are constructed and can be manipulated to affect where Perl interpreter will find the module files.
Default
@INC
Perl interpreter is compiled with a specific default value of
@INC
that it was compiled with. To find out this value, runenv -i perl -V
command (`env -i ignores PERL5LIB environmental variable - see #2) and in the output you will see something like this:$ env -i perl -V...@INC: /usr/local/lib/perl5/5.8.6/i686-linux /usr/local/lib/perl5/5.8.6 /usr/local/lib/perl5/site_perl/5.8.6/i686-linux /usr/local/lib/perl5/site_perl
To change the default path when configuring Perl binary compilation, use
otherlibdirs
variable:Configure -Dotherlibdirs=/usr/lib/perl5/site_perl/5.8.1
Environmental variable
PERL5LIB
(orPERLLIB
)Perl pre-pends
@INC
with a list of directories (colon-separated) contained inPERL5LIB
(if it is not defined,PERLLIB
is used) environmental variable of your shell. To see the contents of @INC after PERL5LIB and PERLLIB environment variables have taken effect, runperl -V
.
References:
- perldoc perlmod
- perldoc lib
- Perl Module Mechanics - a great guide containing practical HOW-TOs
- How do I 'use' a Perl module in a directory not in
@INC
? - Programming Perl - chapter 31 part 13, ch 7.2.41
- How does a Perl program know where to find the file containing Perl module it uses?
There does not seem to be a comprehensive "@INC" FAQ-type post on StackOverflow, so this question is intended as one.
When to use each approach?
If the modules in a directory need to be used by many/all scripts on your site, especially run by multiple users, that directory should be included in default @INC compiled into Perl binary
If the modules in the directory will be used exclusively by a specific user for all the scripts that user runs (or if recompiling Perl is not an option to change default @INC in previous use case), set the users'
PERL5LIB
, usually during user login.NOTE: Please be aware of the usual Unix environment variable pitfalls - e.g. in certain cases running the scripts as a particular user does not guarantee running them with that user's environment set up, e.g. via
su
.
If the modules in the directory need to be used only in specific circumstances (e.g. when the script(s) is executed in development/debug mode, you can either set PERL5LIB manually, or use "-I" perl parameter.
If the modules need to be used only for specific scripts, by ALL users using them, use
use lib/no lib
pragmas in the program itself. It also should be used when the directory to be searched needs to be dynamically determined during runtime - e.g. from script's command line parameters or script's path (see FindBin module for very nice use case)If the directories in @INC need to be manipulated according to some complicated logic, either impossible to too unwieldy to implement by combination of "use lib/no lib" pragmas, then use direct
@INC
manipulation insideBEGIN {}
block or inside a special purpose library designated for @INC manipulation, which must be used by your script(s) before any other modules are used.An example of this is automatically switching between libraries in prod/uat/dev directories, with waterfall library pickup in prod if it's missing from dev and/or UAT (the last condition makes the standard "use lib + FindBin" solution fairly complicated.A detailed illustration of this scenario is in this SO post.
An additional use case for directly manipulating
@INC
is to be able to add subroutine references or object references (yes, Virgina,@INC
can contain custom Perl code and not just directory names, as explained here)
- Resove the problem of @INC of perl.
- ”The Importance of Perl “
- The problem of UDP
- The problem of Titanium
- The problem of UDP
- Root of the Problem
- 1394. Root of the Problem
- The problem of Memory Leak
- TJU Root of the Problem
- The problem of Money Changes
- POJ_3100_Root of the Problem(暴力)
- Root of the Problem-3100
- The problem of Zigzag pattern
- 1394. Root of the Problem
- The Ansewer of Problem 4.7
- the solve of volume problem
- The first image of strawberry perl
- The Recode of the sat-problem
- Doom3
- DLL入门浅析(2)——如何使用DLL
- HttpHandler与HttpModule讲解
- hibernate对象的三种状态
- DLL入门浅析(3)——从DLL中导出变量
- Resove the problem of @INC of perl.
- DLL入门浅析(5)——使用DLL在进程间共享数据
- Poj 3278 Catch That Cow
- 删除一个文件夹
- Linux GCC编译使用动态、静态链接库
- 永州游记3
- 该死的电信
- 了解凹凸映射Bump Map技术的内幕
- POJ 2676 数独