黄健
一次Perl版本升级引发的吐槽大会
2020-10-30 16:01
阅读:571

一、心血来潮

告别Windows系统,在日常办公、学习、研究、写作中都使用Deepin Linux华为定制版已将近一年了。我在工作中使用Perl较为频繁。该定制版Linux系统自带的Perl是5.24版,而最新的Perl已经是5.32版。Perl当前的帮主南瓜王Sawyer X几个月前说要在该最新版基础上推出Perl7云云,所以一时心血来潮,按官网指南,略加发挥:

wget https://www.cpan.org/src/5.0/perl-5.32.0.tar.gz
     tar -xzf perl-5.32.0.tar.gz
     cd perl-5.32.0
     ./Configure -des -Dprefix=/usr
     make
     make test
     sudo make install

下载Perl5.32源代码,并在本地编译安装了。各种测试,返回
All tests successful.
Elapsed: 690 sec
u=7.88  s=4.43  cu=408.77  cs=25.14  scripts=2465  tests=1208438
......我又把/usr/bin目录内老版本的perl删除了,测试,一切正常。

二、乐极生悲

后来在使用sudo apt-get install来安装应用程序时,才发现apt-get各种吐槽,最为常见的是:Can't locate Debconf/Db.pm in @INC (you may need to install the Debconf::Db module)......虽然应用程序也能安装上,而且应用程序也能工作,但安装过程的各种吐槽让人不胜其烦。搜索了一下,Debconf目录和Db.pm都是有的,但在/usr/share/perl5目录里。仔细看了一下,Deepin Linux华为定制版的Perl库目录应该在/usr/share/perl5和/usr/share/perl/5.24.1。而perl -V返回我升级后的@INC为:

    /usr/lib/perl5/site_perl/5.32.0/x86_64-linux
    /usr/lib/perl5/site_perl/5.32.0
    /usr/lib/perl5/5.32.0/x86_64-linux
    /usr/lib/perl5/5.32.0

问题应该就出在这里了。我这也才知道常用的apt-get也需要Perl配合才能完美工作。

三、祸不单行

听说perlbrew很擅长管理一台机器上多个版本的Perl和各种Perl模块。于是sudo apt-get install perlbrew,在apt-get的疯狂吐槽后,whereis perlbrew显示,我要的多版本Perl安装管理利器是安装成功了的。于是perlbrew回车看看,结果:Can't locate App/perlbrew.pm in @INC (you may need to install the App::perlbrew module) ......比其他应用程序还惨,不光安装过程吐槽,安装好的perlbrew罢工了。看样子,apt-get把相关模块安装到了/usr/share/perl5目录去了。当初就应该先安装perlbrew ,再用perlbrew来安装最新版本的Perl5.32;现在反过来想让perlbrew来擦屁股,谁愿意呀。

四、道高一尺

不就是/usr/share/perl5不在@INC里吗?修改.bashrc,加入注释与指令各一句如下:

# Add Deepin Linux Perl Library
export PERL5LIB=/usr/share/perl5

然后source .bashrc,再运行perlbrew,果然正常工作了。一不做,二不休。su root,对/etc/profile如法炮制,这下应该好了吧。

五、魔高一丈

安装生物信息常用软件clustalw,sudo apt-get install clustalw。结果依旧是apt-get的吐槽Can't locate Debconf/Db.pm in @INC (you may need to install the Debconf::Db module)......。奇怪了,普通用户perl -V和切换到root用户perl -V,库目录都有/usr/share/perl5。但就是sudo perl -V没有,依旧是老的那四个。于是visudo,仔细研究了一下,望文生义,把Defaults       env_reset注释掉,保存后,问题依旧。只好把.bashrc、profile、etc/sudoers等都恢复了,另想办法。

六、从头再来

心若在梦就在,天地之间还有真爱。看成败,人生豪迈,只不过是从头再来 。再次一不做,二不休,重新进入源代码目录。运行./Configure,交互式慢慢配置编译选项。大部分地方都按默认回车即可。其中一处交互有问是否添加其他库目录,狠一点,直接输入/usr/share/perl5:/usr/share/perl/5.24.1。还有一处,List of earlier versions to include in @INC? 也不要none了。后续又是make,make test, sudo make install。完了perl -V,显示  @INC:

/usr/lib/perl5/site_perl/5.32.0/x86_64-linux
    /usr/lib/perl5/site_perl/5.32.0
    /usr/lib/perl5/5.32.0/x86_64-linux
    /usr/lib/perl5/5.32.0
    /usr/lib/perl5/site_perl
    /usr/share/perl5
    /usr/share/perl/5.24.1

正好系统里还没有安装pymol和R。于是,sudo apt-get install pymol r-base,顺利安装两个软件,apt-get没有丝毫抱怨了。

七、额外收获

在./Configure交互配置过程中,有一处交互让我恍然大悟,解决了最近的一点困惑。Historically Perl has provided a final fallback of the current working directory '.' when searching for a library. This, however, can lead to problems when a Perl program which loads optional modules is called from a shared directory. This can lead to executing unexpected code.
Exclude . from @INC by default?

以前Perl脚本自己所在目录内的模块都能自动找到,现在不行了。编译perl时,配置里默认是不包含.在库目录数组里的。现在需要在脚本里明示才行了。

转载本文请联系原作者获取授权,同时请注明本文来自黄健科学网博客。

链接地址:http://wap.sciencenet.cn/blog-204973-1256372.html?mobile=1

收藏

分享到:

当前推荐数:2
推荐人:
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?