CPAN #

一、CPAN概述 #

CPAN(Comprehensive Perl Archive Network)是Perl模块仓库,包含超过20万个模块。

1.1 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

或使用Build.PL

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