无法使用导出PERL5LIB更新@INC

时间:2018-12-16 21:29:23

标签: perl

我正在尝试将HTML :: Entities模块路径添加到@INC。我确实导出了PERL5LIB=/mypath/HTML/,然后导出了source ~/.bashrc。该路径反映在PERL5LIB中,而不反映在@INC中。我还缺少其他步骤吗?

我在CentOS6.5上使用perl 5.26.2

编辑:

我(错误地)认为我的路径未添加到@INC,因为当我运行Perl脚本时,我得到了

Can't locate HTML/Entities.pm in @INC (you may need to install the HTML::Entities module)
(@INC contains:
/home/hek/anaconda3/bin/aux/lib/perl5
/home/hek/anaconda3/lib/site_perl/5.26.2/x86_64-linux-thread-multi
/home/hek/anaconda3/lib/site_perl/5.26.2
/home/hek/anaconda3/lib/5.26.2/x86_64-linux-thread-multi
/home/hek/anaconda3/lib/5.26.2
)

(添加了换行符以提高可读性)

但是它确实出现在下面

echo $PERL5LIB
/opt/rh/devtoolset-2/root//usr/lib64/perl5/vendor_perl:/opt/rh/devtoolset-2/root/usr/lib/perl5:/opt/rh/devtoolset-2/root//usr/share/perl5/vendor_perl:/opt/perl/lib/site_perl/5.14.2/x86_64-linux-thread-multi/HTML/

perl -e 'use Data::Dumper; print Dumper(\@INC), "\n"'
$VAR1 = [
          '/opt/rh/devtoolset-2/root//usr/lib64/perl5/vendor_perl',
          '/opt/rh/devtoolset-2/root/usr/lib/perl5',
          '/opt/rh/devtoolset-2/root//usr/share/perl5/vendor_perl',
          '/opt/perl/lib/site_perl/5.14.2/x86_64-linux-thread-multi/HTML/',
          '/home/hek/anaconda3/lib/site_perl/5.26.2/x86_64-linux-thread-multi',
          '/home/hek/anaconda3/lib/site_perl/5.26.2',
          '/home/hek/anaconda3/lib/5.26.2/x86_64-linux-thread-multi',
          '/home/hek/anaconda3/lib/5.26.2',
          '.'
        ];

为什么会有这种差异?

我确实安装了perl的多个版本,但是which perl返回我需要使用的版本~/anaconda3/bin/perl

我尝试将脚本中的shebang从#!/usr/bin/env perl更改为#!/~/anaconda3/bin/perl,但这无济于事。

3 个答案:

答案 0 :(得分:2)

两种可能性:

  • 未在给出错误的<assembly> <inline> <fileSets> <fileSet> <directory>target</directory> <outputDirectory>.</outputDirectory> <fileMode>0644</fileMode> <includes> <include>${project.artifactId}-${project.version}-exec.jar</include> </includes> </fileSet> </fileSets> </inline> </assembly> 进程的父级中设置PERL5LIB环境变量(例如,您是从Web服务器启动的),或者
  • perl命令行开关已提供给-T进程并给出了错误(因为这会导致perl被忽略)。

无论哪种情况,您都可以在源代码中使用PERL5LIB而不是use lib

答案 1 :(得分:1)

use HTML::EntitiesHTML/Entities.pm的目录中查找文件@INC。找不到这样的路径,因为它正在寻找类似/opt/perl/lib/site_perl/5.14.2/x86_64-linux-thread-multi/HTML/HTML/Entities.pm的路径。

将要添加到搜索路径中的目录中的HTML/部分删除,可能会更好。

编辑:仍然存在版本不匹配的问题,但是只要模块是纯Perl且没有任何XS组件,我就不会认为,这将是一个大问题。更好地为您实际使用的perl版本提供正确的路径。这样做,您根本不必操纵搜索路径。

答案 2 :(得分:1)

这是为了总结问题并陈述似乎是最简单的解决方案。

从一线测试的输出中可以清楚地看出,要在v5.26.2下运行的程序中使用了在v5.14.2下安装的模块。即使它确实起作用,那也不是很好。

因此,在需要它的perl版本v5.26.2下安装HTML::Entities

这也解决了您所要解决的问题,此后您就不必为PERL5LIB或其他任何事情而烦恼了。

此外,单行测试中的@INC很明显未加载,就像您怀疑的那样。池上的答案use lib "...";中给出了可能的原因以及解决方法。但是,然后您需要使用为v5.26.2安装的模块版本,并且将其与该perl一起安装后,实际上将无需指定额外的库路径。

最后,如果由于某种原因最终需要添加该路径,请按照Shawn的回答指示,离开HTML(最后一个)目录。使用use HTML::Entities,将搜索目录HTML(查找Entities.pm文件),而您只需要提供包含目录的目录即可。