当前位置: 首页 > 工具软件 > Perl > 使用案例 >

Perl-Perl模块1

钱星辰
2023-12-01

Perl综合典藏网(Comprehensive Perl Archive Network, CPAN)

1. 寻找模块

perl的模块有2种来源

  1. 随perl发行版本一同打包的
  2. 要从CPAN下载

可以在CPAN Search网站或MetaCPAN网站上搜索那些没有随perl发布的模块
在开始寻找模块前,先检查本地是否已经安装该模块

$ perldoc Digest::SHA

如果查看未安装的模块,会看到错误提示

$ perldoc Llamas
No documents found for "Llamas".

用perl提供的cpan命令也可以获取指定模块的详细信息

$ cpan -D Digest::SHA

2. 安装模块

想要安装系统上没有的模块,一般需要先下载打包发布的模块文件包,解压缩后在shell中运行一系列编译安装命令。具体步骤和注意事项可以查阅模块包中的README或INSTALL文件

如果模块使用Perl自带的ExtUtils::MakeMaker封装打包,可以用下面的流程安装

$ perl Makefile.PL
$ make install

如果没有权限安装模块到系统全局目录,可以在Makefile.PL后面加上INSTALL_BASE参数,指定以用户身份可写的安装目录

$ perl Makefile.PL INSTALL_BASE=/Users/fred/lib

有些perl模块开发者要求用另1个模块Module::Build来编译并安装他们的包,流程如下

$ perl Build.PL
$ ./Build install

$ perl Build.PL --install_base=/Users/fred/lib

有些模块的工作依赖于其它模块,所以必须预先安装好前置模块,才能继续编译安装

$ perl -MCPAN -e shell # 使用perl自带的CPAN.pm

$ cpan Module::CoreList LWP CGI::Prototype

$ cpanm DBI WWW::Mechanize # cpanm:cpanminus
C:\ ppm Time::Moment

1. 安装到自己的目录

CPAN工具默认会把模块安装到与perl解释器相同的目录,但是我们经常没有这个目录的写权限

最容易的解决方法时用local::lib模块安装新模块到自己的用户目录下
local::lib模块会自动修改某些环境变量,从而修改CPAN客户端安装模块的位置

$ perl -Mlocal::lib
export PERL_LOCAL_LIB_ROOT="/Users/fred/perl5";
export PERL_MB_OPT="--install_base /Users/fred/perl5";
export PERL_MM_OPT="INSTALL_BASE=/Users/fred/perl5";
export PER5LIB="...";
export PATH="/Users/fred/perl5/bin:$PATH";

如果在cpan客户端使用-I选项,就会参照上面列出的环境变量安装指定的模块

$ cpan -I Set::CrossProduct

而cpanm好像更聪明一点。如果已经设置了那些local::lib会帮助设置的环境变量的话,cpanm会直接按照这些设定安装。如果没有,cpanm会检查默认的安装路径是否拥有可写权限,如果没有写权限,cpanm会自动帮忙加载local::lib模块

也可以直接配置CPAN客户端,这样以后就一直安装到指定目录。可以在CPAN.pm配置文件中设定以下参数,以后使用CPAN.pm shell的时候就会自动安装新模块到指定的私有目录。
为了兼容,需要配置2个设定,1个给ExtUils::Makemaker用,1个给Module::Build用

$ cpan
cpan> o conf makepl_arg INSTALL_BASE=/Users/fred/perl5
cpan> o conf mbuild_arg "--install_base /Users/fred/perl5"
cpan> o conf commit

需要注意的是,这里设定的是和local::lib给出的相同目录。在CPAN.pm配置文件中加上这些内容后,每次安装模块都会自动附加这些安装参数。

在选定安装perl模块的路径后,还要告诉应用程序要在哪能找到这些模块文件

# 在perl程序内部
use local::lib;

use lib qw( /Users/fred/perl5 );
 类似资料: