由于生物信息早期最多用的語言是perl,因此不可避免就要用別人的perl腳本或者基于perl的項目來處理數據。
使用perl腳本和使用其他編程語言的腳本沒啥不同,畢竟你只要傳入參數,它就能給你結果。因此對于我們這些不用perl寫腳本,只需要調用的人而言,唯一要學會的事情就是**如何安裝perl的模塊”。
關于perl模塊安裝,最古老的方法就是使用perl -MCPAN -e shell
或者是cpan
(兩者等價),這也是我最先接觸的方法,這里介紹如何使用local::lib
和cpanm
實現非root權限安裝perl模塊。
使用系統自帶的perl
安裝任何軟件最怕遇到的問題就是權限問題,因此我們需要先安裝local::lib
,使得我們能夠將perl模塊安裝到任何地方,簡單的說就是安裝到我們的家目錄下
第一步,下載源代碼進行編譯安裝
wget https://cpan.metacpan.org/authors/id/H/HA/HAARG/local-lib-2.000024.tar.gz
tar xf local-lib-2.000024.tar.gz
cd local-lib-2.000024
perl Makefile.PL --bootstrap=~/opt
make test && make install
第二步:設置環境變量,使得perl在安裝模塊的時候會優先使用我們指定的路徑
echo 'eval "$(perl -I$HOME/opt/lib/perl5 -Mlocal::lib=$HOME/opt)"' >> ~/.bashrc
先用perl -I$HOME/opt/lib/perl5 -Mlocal::lib=$HOME/opt
表示運行前先添加$HOME/opt/lib/perl5
到自己的搜索路徑@INC
中,然后傳入參數$HOME/opt
執行模塊local::lob
,這個模塊的執行結果會輸出如下內容
Attempting to create directory /home6/wangjw/opt
PATH="/home/zgxu/opt/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="/home/zgxu/opt/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="/home/zgxu/opt${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"/home/zgxu/opt\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/home/zgxu/opt"; export PERL_MM_OPT;
這些就作為eval
的參數進行執行,也就是說你重啟終端后后,PERL5LIB
PERL_LOCAL_LIB_ROOT
,PERL_MB_OPT
,PERL_MM_OPT
這幾個變量就會重新設置,以此保證你后續安裝perl模塊時,會優先安裝到自己的選擇的目錄
第三步:安裝cpam. 由于之前已經配置了local::lib
,因此perl編譯的工具都會默認安裝到~/opt
目錄下
wget https://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7043.tar.gz
tar xf App-cpanminus-1.7043.tar.gz
cd App-cpanminus-1.7043
perl Makefile.PL
make test && make install
第四步:使用國內鏡像提高下載速度,可以通過別名的方式實現
echo 'alias cpanm="cpanm --mirror http://mirrors.163.com/cpan --mirror-only"' >>~/.bashrc
之后便可以使用cpanm Module::Name
安裝任意的軟件了。
自己編譯一個perl
自己編譯Perl的好處就在于之后的perl模塊都會安裝到自己的Perl目錄下,而不會對系統造成影響。
cd ~/src
wget -4 http://www.cpan.org/src/5.0/perl-5.26.1.tar.gz
tar xf perl-5.26.1.tar.gz
cd perl-5.26.1
./Configure -des -Dprefix=$HOME/opt/sysoft/perl-5.26.1
make test
make install
然后用perl -e '{print "$_\n" foreach @INC}'
會發現perl只會在自己的目錄~/opt/sysoft/perl-5.26.1
下查找模塊。那么使用cpanm Module::Name
安裝的任何包都只會安裝到~/opt/sysoft/perl-5.26.1
下,你也不需要安裝local::lib
了
conda的perl和系統的perl沖突
有一次我遇到這個問題
perl: symbol lookup error: /home/wangjw/perl5/lib/perl5/x86_64-linux-thread-multi/auto/Cwd/Cwd.so: undefined symbol
這個問題是因為用系統perl安裝的軟件被conda的perl優先查找到導致,用perl -V
和perl -e '{print "$_\n" foreach @INC}'
可以發現conda的perl查找路徑低于我為系統perl安裝的路徑,解決方案如下
export PERL5LIB=""