CPAN #
一、CPAN概述 #
CPAN(Comprehensive Perl Archive Network)是Perl模块仓库,包含超过20万个模块。
1.1 CPAN网站 #
- https://metacpan.org - 现代化CPAN搜索
- https://cpan.org - 官方CPAN
1.2 模块命名约定 #
| 类型 | 命名空间 | 示例 |
|---|---|---|
| 数据库 | DBI::* | DBI, DBD::mysql |
| Web | CGI::, HTTP:: | HTTP::Request |
| 文件 | File::* | File::Spec, File::Copy |
| 文本 | Text::* | Text::CSV |
| 工具 | Util::* | Scalar::Util, List::Util |
二、安装模块 #
2.1 cpan命令 #
bash
cpan Module::Name
首次运行会进行配置:
bash
cpan
cpan> o conf init
2.2 cpanm(推荐) #
cpanm 是更简洁的模块安装工具:
bash
cpanm Module::Name
cpanm --verbose Module::Name
cpanm --notest Module::Name
安装cpanm:
bash
cpan App::cpanminus
或使用系统包管理器:
bash
sudo apt install cpanminus
sudo yum install perl-App-cpanminus
brew install cpanminus
2.3 从源码安装 #
bash
perl Makefile.PL
make
make test
sudo make install
bash
perl Build.PL
./Build
./Build test
sudo ./Build install
2.4 本地安装 #
安装到用户目录:
bash
cpanm --local-lib=~/perl5 Module::Name
eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
三、模块使用 #
3.1 基本导入 #
perl
use strict;
use warnings;
use JSON;
use LWP::UserAgent;
3.2 选择性导入 #
perl
use List::Util qw(sum max min);
use File::Spec qw(catfile rel2abs);
3.3 导入标签 #
perl
use POSIX qw(:sys_wait_h :signal_h);
3.4 版本要求 #
perl
use JSON 4.00;
use Moo 2.0;
四、常用模块 #
4.1 数据处理 #
perl
use JSON;
use Data::Dumper;
use YAML;
my $json = JSON->new;
my $data = $json->decode('{"name":"Tom"}');
my $str = $json->encode($data);
print Dumper($data);
4.2 文件操作 #
perl
use File::Spec;
use File::Basename;
use File::Copy;
use File::Path qw(make_path remove_tree);
my $path = File::Spec->catfile("dir", "file.txt");
make_path "a/b/c";
4.3 网络请求 #
perl
use LWP::UserAgent;
use HTTP::Request;
my $ua = LWP::UserAgent->new;
my $response = $ua->get("http://example.com");
if ($response->is_success) {
print $response->decoded_content;
}
4.4 数据库 #
perl
use DBI;
my $dbh = DBI->connect(
"dbi:mysql:database=test;host=localhost",
"user", "password",
) or die $DBI::errstr;
my $sth = $dbh->prepare("SELECT * FROM users");
$sth->execute();
while (my $row = $sth->fetchrow_hashref) {
print $row->{name};
}
$dbh->disconnect();
4.5 日期时间 #
perl
use DateTime;
my $dt = DateTime->now;
print $dt->ymd;
print $dt->hms;
my $dt2 = DateTime->new(
year => 2024,
month => 3,
day => 27,
);
4.6 命令行选项 #
perl
use Getopt::Long;
my $verbose = 0;
my $output = "";
GetOptions(
"verbose" => \$verbose,
"output=s" => \$output,
);
五、创建模块 #
5.1 模块结构 #
text
MyModule/
├── lib/
│ └── MyModule.pm
├── t/
│ └── basic.t
├── Makefile.PL
├── README.md
└── MANIFEST
5.2 Makefile.PL #
perl
use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'MyModule',
VERSION_FROM => 'lib/MyModule.pm',
PREREQ_PM => {
'strict' => 0,
'warnings' => 0,
},
TEST_REQUIRES => {
'Test::More' => 0,
},
);
5.3 模块文件 #
perl
package MyModule;
use strict;
use warnings;
our $VERSION = '1.00';
use Exporter 'import';
our @EXPORT_OK = qw(func1 func2);
sub func1 {
return "Function 1";
}
sub func2 {
return "Function 2";
}
1;
__END__
=head1 NAME
MyModule - A sample module
=head1 SYNOPSIS
use MyModule qw(func1);
print func1();
=cut
5.4 测试文件 #
perl
use Test::More tests => 2;
use MyModule qw(func1 func2);
is(func1(), "Function 1", "func1 works");
is(func2(), "Function 2", "func2 works");
5.5 构建和测试 #
bash
perl Makefile.PL
make
make test
make manifest
make dist
六、模块开发工具 #
6.1 Module::Starter #
bash
cpanm Module::Starter
module-starter --module=MyModule --author="Your Name"
6.2 Dist::Zilla #
bash
cpanm Dist::Zilla
dzil new MyModule
dzil build
dzil test
dzil release
6.3 Minilla #
bash
cpanm Minilla
minil new MyModule
minil test
minil release
七、依赖管理 #
7.1 cpanfile #
创建 cpanfile:
perl
requires 'JSON' => 4.00;
requires 'LWP::UserAgent' => 6.00;
requires 'DBI' => 1.60;
on 'test' => sub {
requires 'Test::More' => 1.00;
};
on 'develop' => sub {
requires 'Dist::Zilla' => 6.00;
};
7.2 安装依赖 #
bash
cpanm --installdeps .
7.3 Carton #
bash
cpanm Carton
carton install
carton exec perl script.pl
八、实践练习 #
练习1:使用JSON模块 #
perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;
use JSON;
my $data = {
name => "Tom",
age => 25,
skills => ["Perl", "Python", "JavaScript"],
};
my $json = JSON->new->pretty;
my $encoded = $json->encode($data);
say $encoded;
my $decoded = $json->decode($encoded);
say "Name: $decoded->{name}";
say "Skills: " . join(", ", @{$decoded->{skills}});
练习2:使用LWP获取网页 #
perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->agent("MyScript/1.0");
my $response = $ua->get("http://example.com");
if ($response->is_success) {
say "Status: " . $response->code;
say "Content-Length: " . length($response->content);
} else {
die "Error: " . $response->status_line;
}
练习3:创建简单模块 #
perl
package Greeting;
use strict;
use warnings;
use Exporter 'import';
our @EXPORT_OK = qw(hello goodbye);
sub hello {
my $name = shift // "World";
return "Hello, $name!";
}
sub goodbye {
my $name = shift // "World";
return "Goodbye, $name!";
}
1;
使用:
perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;
use Greeting qw(hello goodbye);
say hello("Tom");
say goodbye("Tom");
九、总结 #
本章学习了:
- CPAN概述
- 模块安装(cpan、cpanm)
- 模块使用
- 常用模块介绍
- 创建和发布模块
- 依赖管理
恭喜你完成了Perl完全指南的学习!
最后更新:2026-03-27