我用CPAN成功安装了一个模块,但是perl找不到它.为什么?

Thi*_*Not 15 perl cpan

我安装了这样的CPAN模块:

cpan Acme
Run Code Online (Sandbox Code Playgroud)

根据输出,安装成功:

Running install for module 'Acme'
...
All tests successful.
Files=2, Tests=3,  0 wallclock secs ( 0.02 usr  0.00 sys +  0.04 cusr  0.00 csys =  0.06 CPU)
Result: PASS
  INGY/Acme-1.11111111111.tar.gz
  /usr/bin/make test -- OK
Running make install
Manifying 1 pod document
Installing /home/foo/perl5/lib/perl5/Acme.pod
Installing /home/foo/perl5/lib/perl5/Acme.pm
Installing /home/foo/perl5/man/man3/Acme.3pm
Appending installation info to /home/foo/perl5/lib/perl5/x86_64-linux-thread-multi/perllocal.pod
  INGY/Acme-1.11111111111.tar.gz
  /usr/bin/make install  -- OK
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用该模块时,我收到一个错误:

$ perl -MAcme -e1
Can't locate Acme.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted.
Run Code Online (Sandbox Code Playgroud)

即使安装成功,为什么perl找不到该模块?我怎样才能解决这个问题?

Thi*_*Not 19

该模块安装在这里:

/home/foo/perl5/lib/perl5/Acme.pm
Run Code Online (Sandbox Code Playgroud)

但是perl会查找模块@INC,在这种情况下包含:

/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
.
Run Code Online (Sandbox Code Playgroud)

(.指当前的工作目录.)

由于模块不在@INC,perl在没有一些帮助的情况下找不到它.

为什么CPAN在外面安装模块@INC

一个常见原因是将CPAN配置为引导local :: lib,以便模块安装在主目录而不是系统Perl目录中.如果您具有CPAN 1.9463或更高版本并且您在默认安装路径中没有写入权限,则第一次运行CPAN时将提示您:

Warning: You do not have write permission for Perl library directories.

To install modules, you need to configure a local Perl library directory or
escalate your privileges.  CPAN can help you by bootstrapping the local::lib
module or by configuring itself to use 'sudo' (if available).  You may also
resolve this problem manually if you need to customize your setup.

What approach do you want?  (Choose 'local::lib', 'sudo' or 'manual')
 [local::lib]
Run Code Online (Sandbox Code Playgroud)

如果您选择引导local :: lib(默认值),则该模块将安装在其中~/perl5.您可能还会被提示:

Would you like me to append that to /home/foo/.bashrc now? [yes]
Run Code Online (Sandbox Code Playgroud)

如果选择yes(默认值),则会将一些变量添加到您的.bashrc(或shell的等效变量)中,以便将来运行CPAN时,模块将继续安装在您的主目录中:

PATH="/home/foo/perl5/bin${PATH+:}${PATH}"; export PATH;
PERL5LIB="/home/foo/perl5/lib/perl5${PERL5LIB+:}${PERL5LIB}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="/home/foo/perl5${PERL_LOCAL_LIB_ROOT+:}${PERL_LOCAL_LIB_ROOT}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"/home/foo/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/home/foo/perl5"; export PERL_MM_OPT;
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

如果CPAN将上述环境变量添加到您的.bashrc(或等效的),最简单的方法是启动一个新的shell(或源代码.bashrc).这将设置PERL5LIB为perl可以找到安装的模块~/perl5.

另一方面,如果您具有sudo访问权限并且希望CPAN在系统Perl目录中而不是在主目录中安装模块,请从您的主目录中删除环境变量设置 .bashrc(或等效的)中,启动CPAN shell,然后运行:

o conf init
Run Code Online (Sandbox Code Playgroud)

这将重置CPAN配置.如果要引导local :: lib,将再次提示您; 改为输入"sudo".一般来说,我不建议这样做; 通常最好使用你的发行版包管理器(例如yum,apt)在系统Perl目录中安装模块.

另请参阅:如何在不在@INC中的目录中"使用"Perl模块?