История языка Perl
Черновик статьи. Ниже — развёрнутая хронология, идеи дизайна и контекст экосистемы; отдельные главы по Raku и Modern Perl Best Practices дополнятся позже.
Краткая хронология
| Год | Событие |
|---|---|
| 1987 | Larry Wall публикует Perl 1 — отчётность и текстовая обработка в Unix |
| 1991 | Perl 4 — рост популярности в системном администрировании |
| 1994 | Perl 5 — переписанный движок, модули, основа современной экосистемы |
| 1995 | CPAN — централизованный архив модулей, один из первых крупных package registry |
| 1996–2000 | CGI-скрипты — Perl как язык раннего веба |
| 2000s | BioPerl, log analysis, glue в enterprise cron |
| 2000 | Начало разработки Perl 6 (позже Raku) |
| 2015 | Raku переименован и отделён от Perl 5 |
| 2010s–2020s | Perl 5 в режиме maintenance: use v5.40, signatures, isa operator |
| 2020s | Legacy support; новый прикладной код чаще на Python/Go |
Larry Wall — лингвист по образованию; синтаксис Perl отражает идею естественных конструкций для частых текстовых задач, а не минимализм ради минимализма.
Мотивация Larry Wall
Исходная задача — заменить цепочку sed, awk, shell и C одним читаемым скриптом для отчётов NASA (история часто цитируется в сообществе). Язык вырос в Swiss Army chainsaw — мощный, но требующий осторожности в больших проектах.
Ключевые принципы:
- Практичность важнее теоретической чистоты.
- Текст — first-class citizen: regex, here-doc, встроенные функции
split,join,chomp. - TMTOWTDI — несколько способов решить задачу; в команде нужен стиль-гайд.
Идеи дизайна
Контексты
Perl различает scalar, list и void context. Одна функция возвращает разное:
my @words = qw(a b c d);
my $n = @words; # 4 в scalar context
my ($x, $y) = @words; # a, b в list context
Регулярные выражения
Оператор =~ привязывает regex к строке. Захваты $1, $2, именованные группы в новых версиях — основа парсинга логов.
if ($line =~ /^(\d{4}-\d{2}-\d{2})\s+(ERROR|WARN)\s+(.*)$/) {
my ($date, $level, $msg) = ($1, $2, $3);
}
CPAN
Comprehensive Perl Archive Network — тысячи модулов:
| Модуль | Назначение |
|---|---|
DBI | Универсальный доступ к БД |
LWP | HTTP-клиент |
Mojolicious | Веб-фреймворк |
Text::CSV | CSV без ручного split |
Try::Tiny | try/catch стиль |
Установка: cpanm Module::Name — см. первую программу.
Объектно-ориентированный Perl
Эволюция:
bless+ пакеты — минимальный OO.- Moose / Moo — классы, роли, атрибуты в Modern Perl.
- Для legacy читают старый OO без Moose.
Perl 5 и Raku
| Perl 5 | Raku | |
|---|---|---|
| Статус | Maintenance, обратная совместимость | Отдельный язык и community |
| Синтаксис | $scalar, @array, %hash | Другая грамматика, grammars |
| Runtime | perl interpreter | Rakudo |
| Вакансии | Legacy, DevOps | Нишевые |
В энциклопедии раздел Perl = Perl 5. Raku упоминается, чтобы не путать ветки при чтении старых статей про "Perl 6".
Perl сегодня
Новый прикладной код чаще на Python. Perl остаётся в:
- legacy web (mod_perl, старые CGI);
- log parsing и DevOps-скриптах;
- bioinformatics (BioPerl);
- embedded в больших Unix-системах (configure scripts, tooling).
Modern Perl — дисциплина: use strict; use warnings;, use v5.xx, форматирование perltidy, ревью perlcritic, тесты через prove.
Сравнение с Python для скриптов
| Критерий | Perl 5 | Python 3 |
|---|---|---|
| Однострочник в pipe | perl -pe | python -c |
| Regex | нативно | re |
| Читаемость в команде | нужен стиль | обычно проще |
| CPAN / PyPI | оба зрелые | PyPI активнее для ML/AI |
| Найм | legacy niche | широкий рынок |
Для нового проекта чаще Python; для поддержки Perl — этот раздел.
Сообщество и культура
- Perl Mongers — локальные группы пользователей.
- Конференции YAPC (Yet Another Perl Conference).
- Книги: Programming Perl (camel book), Modern Perl (chromatic).
- Мемы про "write-only Perl" — напоминание о дисциплине стиля.
Что дополнится в следующих версиях статьи
- Детальная таблица релизов 5.10–5.40 (signatures,
smartmatchremoval). - PSGI/Plack и современный Perl веб.
- Perl в Docker и CI (perlbrew в образе).
- Кейсы миграции Perl → Python по модулям.
Книга Modern Perl (бесплатно онлайн) — лучший вход после первой программы. Для истории CGI и раннего веба см. веб-разработку.
Дальше: первая программа · о разделе.
Larry Wall — контекст создания
Wall работал над отчётами для NSA и Unisys; Perl 1 (1987) решал задачу text processing быстрее shell и компактнее C. Название — "Practical Extraction and Report Language" (и "Pathologically Eclectic Rubbish Lister").
Perl 4 → Perl 5
Perl 5 (1994) принёс:
- модульную систему
package; - references и
blessдля ОО; use strictculture позже;__DATA__секцию в файле.
Именно Perl 5 — то, что имеют в виду в 2025.
CGI и веб-эра
#!/usr/bin/env perl
use CGI qw(:standard);
print header,
start_html('Hello'),
h1('Hello CGI'),
end_html;
До PHP dominance многие сайты 1990s — CGI на Perl. Legacy хостинг до сих пор может содержать такие скрипты в cgi-bin/.
BioPerl
BioPerl — коллекция модулей для bioinformatics (последовательности, BLAST, форматы GenBank). Миграция на Python (Biopython) идёт годами — Perl остаётся в lab pipelines.
Modern Perl (2020s)
use v5.40;
use strict;
use warnings;
use feature qw(signatures);
no warnings 'experimental::signatures';
sub add ($a, $b) {
return $a + $b;
}
Signatures убирают my ($a, $b) = @_; boilerplate.
Книги и ресурсы
| Книга | Уровень |
|---|---|
| Learning Perl (Llama) | Начало |
| Intermediate Perl (Alpaca) | References, ОО |
| Programming Perl (Camel) | Справочник |
| Modern Perl (chromatic) | Стиль 2010+ |
PSGI и современный Perl web
PSGI — интерфейс между Perl web app и сервером (аналог WSGI в Python):
# app.psgi
use strict;
use warnings;
my $app = sub {
my $env = shift;
return [200, ['Content-Type' => 'text/plain'], ['Hello PSGI']];
};
$app;
Запуск через plackup:
cpanm Plack
plackup app.psgi
Mojolicious — full-stack framework с async и встроенным сервером. Legacy CGI → PSGI → Mojolicious — типичный путь модернизации.
Perl в DevOps и automation
| Сценарий | Пример |
|---|---|
| Log grep | perl -ne 'print if /ERROR/' *.log |
| In-place replace | perl -pi -e 's/old/new/g' *.conf |
| JSON glue | JSON::MaybeXS + cpanm |
| Cron reports | Email через MIME::Lite |
Рядом с Bash в pipeline; Perl когда regex и структуры сложнее shell.
Релизы Perl 5 — ключевые вехи
| Версия | Фича |
|---|---|
| 5.8 | Unicode groundwork |
| 5.10 | say, given/when (smartmatch позже deprecated) |
| 5.14 | yada yada operator ... |
| 5.18 | Hash randomization security |
| 5.36 | Signatures stable с use v5.36 |
| 5.40 | isa operator, feature bundle |
Проверка версии: perl -v. На production pin версию в Docker или perlbrew.
Миграция Perl → Python (поэтапно)
- Inventory — список скриптов, cron, owners.
- Tests —
proveна critical paths перед rewrite. - Strangler — новые features на Python, старые модули Perl до замены.
- Data layer — общая БД; замена только glue layer.
- Decommission — удалить Perl когда coverage 100%.
Сравнение экосистем — Python intro.
Упражнения
- Постройте timeline 1987–2025 на одной странице.
- Объясните scalar vs list context на трёх примерах.
- Найдите CGI script на GitHub — опишите структуру.
- Установите модуль через
cpanmи выведите версию. - Сравните
perl -peиsedдля одной замены. - Прочитайте BioPerl module synopsis на MetaCPAN.
- Напишите
use strictscript с regex capture groups. - Объясните разницу Perl 5 и Raku новичку.
- Найдите
blessOO в legacy repo. - Связь с PHP CGI era — параграф.
Troubleshooting при чтении legacy
| Симптom | Что искать |
|---|---|
$ vs @ vs % | Sigil wrong context |
| Bareword | Missing quotes или use strict |
use lib | Local module path hack |
$1 after failed match | Undefined capture |
each on hash | Deprecated pattern |
FAQ
Perl мёртв? Нет — maintenance mode; legacy и niche активны.
Perl 6? Переименован в Raku — другой язык.
CPAN vs MetaCPAN? MetaCPAN — modern search UI.
Moose или Moo? Moo легче; Moose полнее для больших OO.
TMTOWTDI плохо? Без style guide — да; с PBP — manageable.
Python заменил Perl? В новых проектах часто; Perl остаётся в legacy.
One-liner -p vs -n? -p prints each line; -n silent unless print.
use v5.40? Feature bundle для современного синтаксиса.
Docker Perl? Official perl image + cpanm in Dockerfile.
Security? taint mode deprecated; validate input explicitly.
Regex only in Perl? Native; Python re отдельный модуль.
Hiring? Legacy ops, bioinformatics, security parsing.
Wall still active? Community figure; Perl 5 pumpking rotates.
Embedded in Postgres? plperl — Perl in DB functions.
YAPC still runs? Community conferences; online and regional events.
perlbrew use? Multiple Perl versions per user without system override.
Связанные материалы
| Тема | Ссылка |
|---|---|
| Первая программа | 7.md |
| О разделе | intro.md |
| Python | /encyclopedia/5-languages/5-02-python/intro |
| Bash | /encyclopedia/5-languages/5-25-bash/intro |
| Пакетные менеджеры | /encyclopedia/4-code-dev/4-02-chto-takoe-kod-i-kak-on-rabotaet/621 |
Дальше: первая программа · о разделе.
Итоговый чек-лист истории Perl
- Объяснены контексты scalar/list/void
- Различены Perl 5 и Raku
- Названы CPAN, PSGI, BioPerl
- Прочитан план 7.md
Дополнительное упражнение
Найдите на MetaCPAN модуль Try::Tiny — прочитайте synopsis и объясните, зачем try/catch в Perl 5 без встроенных exceptions. Связь с отладкой — явная обработка $@ после eval.
Perl и Unicode (обзор)
use v5.36;
use utf8;
use open ':encoding(UTF-8)';
binmode STDOUT, ':encoding(UTF-8)';
Legacy код без utf8 — частый источник mojibake.
Упражнения (история)
- Год первого CPAN upload.
- TMTOWTDI одним абзацем.
- Raku и Perl 5 в вакансиях.
- Однострочник: подсчёт строк в файле.
- Зачем
use strict?