||
一、心血来潮
告别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时,配置里默认是不包含.在库目录数组里的。现在需要在脚本里明示才行了。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-27 04:03
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社