Модули и CPAN

Представь задачу: нужно скачать содержимое веб-страницы, распарсить дату в неудобном формате или аккуратно вывести данные в формате JSON. Каждую из этих задач в принципе можно написать самому — но на это уйдёт время, а результат почти наверняка будет содержать баги, которые уже давно нашли и исправили другие программисты, решавшие ту же задачу до тебя. Именно для этого в Perl есть модули — переиспользуемые куски кода, написанные один раз и доступные для подключения в любой скрипт, — и CPAN, гигантский общественный архив таких модулей.

Зачем это нужно в языке

Perl существует с 1987 года, и за десятилетия его использования тысячи разработчиков по всему миру уже написали код почти для любой типовой задачи: работа с датами, отправка писем, чтение форматов файлов, взаимодействие с базами данных, разбор текста по сложным правилам. Если каждый раз решать эти задачи заново, разработка будет медленной, а код — более сырым, чем у уже отточенного годами использования решения.

CPAN расшифровывается как Comprehensive Perl Archive Network — «Всеобъемлющая сеть архивов Perl». Это открытый каталог модулей, куда любой Perl-разработчик может опубликовать свой код, а любой другой — скачать и использовать его в своём проекте. На сегодняшний день в CPAN десятки тысяч модулей на самые разные случаи: от простых утилит для работы со строками до полноценных фреймворков для веб-разработки.

Синтаксис с примером

Модуль подключается той же директивой use, что мы уже видели в use strict и use warnings — на самом деле это тоже модули, просто входящие в стандартную поставку Perl. Вот пример с модулем List::Util, который тоже идёт вместе с Perl и добавляет полезные функции для работы со списками:

use strict;
use warnings;
use List::Util qw(max min sum);

my @scores = (67, 89, 45, 92, 71);

print "Максимум: ", max(@scores), "\n";
print "Минимум: ", min(@scores), "\n";
print "Сумма: ", sum(@scores), "\n";

Вывод:

Максимум: 92
Минимум: 45
Сумма: 364

Три готовые функции — max, min и sum — сэкономили нам написание трёх собственных подпрограмм, каждая из которых была бы похожа на max_value из первого урока этого раздела.

Разбор построчно

use List::Util qw(max min sum); — подключает модуль с именем List::Util (двойное двоеточие в имени — это способ группировки модулей по «пространствам имён», похоже на папки в файловой системе) и явно указывает, какие функции из него нужны в этом скрипте: max, min и sum. Конструкция qw(...) — это просто удобный способ написать список слов без кавычек и запятых у каждого: qw(max min sum) равнозначно списку ("max", "min", "sum").

max(@scores), min(@scores), sum(@scores) — вызовы функций из подключённого модуля. После use они становятся доступны в коде так, как будто это обычные встроенные функции Perl, хотя на самом деле они определены внутри модуля List::Util.

Модули, которые идут в комплекте с самим Perl (как List::Util или strict), называют стандартной библиотекой — их не нужно отдельно скачивать. А вот модули из CPAN, написанные сторонними разработчиками, устанавливаются отдельно — обычно консольной командой вроде cpan Module::Name или более современным инструментом cpanm — и только после этого их можно подключать через use точно так же, как встроенные.

Практический пример

Разница между «написать самому» и «взять готовое» особенно заметна на задачах, которые кажутся простыми, но на самом деле полны неочевидных деталей. Разбор дат — классический пример: может показаться, что достаточно разрезать строку по дефисам, но реальные даты приходят в десятках форматов, бывают високосные годы, разные часовые пояса. Вот как выглядит использование стандартного модуля POSIX для работы с текущей датой без ручного вычисления:

use strict;
use warnings;
use POSIX qw(strftime);

my @now = localtime();
my $formatted = strftime("%d.%m.%Y", @now);

print "Сегодняшняя дата: $formatted\n";

Вывод:

Сегодняшняя дата: 01.07.2026

localtime() — встроенная функция Perl, которая возвращает текущее время в виде списка чисел (секунды, минуты, часы, день месяца и так далее). strftime из модуля POSIX берёт этот список и превращает его в аккуратную строку по указанному шаблону — здесь "%d.%m.%Y" означает «день.месяц.год». Писать такое форматирование вручную, с учётом всех возможных случаев, значительно дольше и рискованнее, чем взять готовую проверенную функцию.

Частые ошибки

Первая ошибка — пытаться подключить модуль, который не установлен в системе, и получить ошибку вроде Can't locate Module/Name.pm in @INC. Она означает ровно то, что написано: Perl искал файл этого модуля в списке известных ему папок (этот список хранится в специальной переменной @INC) и не нашёл. Модули из CPAN нужно сначала установить отдельной командой, прежде чем их можно будет подключить через use.

Вторая ошибка — писать с нуля то, для чего уже существует надёжный, годами проверенный модуль. Разбор JSON, работа с датами, HTTP-запросы — для всего этого есть популярные решения на CPAN (JSON, DateTime, LWP::UserAgent и другие), и самодельная реализация почти всегда получается более хрупкой, чем библиотека, которую тестировали тысячи пользователей.

Третья ошибка — подключать в список qw(...) после имени модуля функции, которых в нём на самом деле нет, или неправильно писать их имена. Это не всегда сразу ловится Perl'ом одинаково явно, поэтому при первом использовании незнакомого модуля стоит свериться с его документацией — у каждого модуля на CPAN есть страница с описанием и примерами.

Итоги

CPAN — это огромный общедоступный архив готовых Perl-модулей на любые типовые задачи, накопленный за десятилетия использования языка. Модуль подключается директивой use ИмяМодуля;, а какие именно функции из него нужны — можно уточнить через qw(...). Часть модулей (например, List::Util, POSIX, уже знакомые strict и warnings) идёт в комплекте с самим Perl, остальные из CPAN нужно установить отдельно. Использовать готовый проверенный модуль почти всегда надёжнее и быстрее, чем писать то же самое с нуля.

Проверьте себя
1. Что такое CPAN?
AВстроенная функция Perl для вывода текста на экран
BОткрытый общественный архив готовых модулей для Perl, куда разработчики публикуют переиспользуемый код
CНазвание компании, которая создала язык Perl
DСпециальный тип переменной для хранения списков
2. Какой директивой в коде подключается модуль, например List::Util?
Aimport List::Util;
Brequire CPAN("List::Util");
Cuse List::Util qw(max min sum);
Dload "List::Util";