Модули и 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.2026localtime() — встроенная функция 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 нужно установить отдельно. Использовать готовый проверенный модуль почти всегда надёжнее и быстрее, чем писать то же самое с нуля.