Перейти к основному содержимому

История языка Perl

Разработчику

Черновик статьи. Ниже — развёрнутая хронология, идеи дизайна и контекст экосистемы; отдельные главы по Raku и Modern Perl Best Practices дополнятся позже.


Краткая хронология

ГодСобытие
1987Larry Wall публикует Perl 1 — отчётность и текстовая обработка в Unix
1991Perl 4 — рост популярности в системном администрировании
1994Perl 5 — переписанный движок, модули, основа современной экосистемы
1995CPAN — централизованный архив модулей, один из первых крупных package registry
1996–2000CGI-скрипты — Perl как язык раннего веба
2000sBioPerl, log analysis, glue в enterprise cron
2000Начало разработки Perl 6 (позже Raku)
2015Raku переименован и отделён от Perl 5
2010s–2020sPerl 5 в режиме maintenance: use v5.40, signatures, isa operator
2020sLegacy 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Универсальный доступ к БД
LWPHTTP-клиент
MojoliciousВеб-фреймворк
Text::CSVCSV без ручного split
Try::Tinytry/catch стиль

Установка: cpanm Module::Name — см. первую программу.

Объектно-ориентированный Perl

Эволюция:

  1. bless + пакеты — минимальный OO.
  2. Moose / Moo — классы, роли, атрибуты в Modern Perl.
  3. Для legacy читают старый OO без Moose.

Perl 5 и Raku

Perl 5Raku
СтатусMaintenance, обратная совместимостьОтдельный язык и community
Синтаксис$scalar, @array, %hashДругая грамматика, grammars
Runtimeperl interpreterRakudo
Вакансии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 5Python 3
Однострочник в pipeperl -pepython -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, smartmatch removal).
  • 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 strict culture позже;
  • __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 grepperl -ne 'print if /ERROR/' *.log
In-place replaceperl -pi -e 's/old/new/g' *.conf
JSON glueJSON::MaybeXS + cpanm
Cron reportsEmail через MIME::Lite

Рядом с Bash в pipeline; Perl когда regex и структуры сложнее shell.


Релизы Perl 5 — ключевые вехи

ВерсияФича
5.8Unicode groundwork
5.10say, given/when (smartmatch позже deprecated)
5.14yada yada operator ...
5.18Hash randomization security
5.36Signatures stable с use v5.36
5.40isa operator, feature bundle

Проверка версии: perl -v. На production pin версию в Docker или perlbrew.


Миграция Perl → Python (поэтапно)

  1. Inventory — список скриптов, cron, owners.
  2. Testsprove на critical paths перед rewrite.
  3. Strangler — новые features на Python, старые модули Perl до замены.
  4. Data layer — общая БД; замена только glue layer.
  5. Decommission — удалить Perl когда coverage 100%.

Сравнение экосистем — Python intro.


Упражнения

  1. Постройте timeline 1987–2025 на одной странице.
  2. Объясните scalar vs list context на трёх примерах.
  3. Найдите CGI script на GitHub — опишите структуру.
  4. Установите модуль через cpanm и выведите версию.
  5. Сравните perl -pe и sed для одной замены.
  6. Прочитайте BioPerl module synopsis на MetaCPAN.
  7. Напишите use strict script с regex capture groups.
  8. Объясните разницу Perl 5 и Raku новичку.
  9. Найдите bless OO в legacy repo.
  10. Связь с PHP CGI era — параграф.

Troubleshooting при чтении legacy

СимптomЧто искать
$ vs @ vs %Sigil wrong context
BarewordMissing quotes или use strict
use libLocal module path hack
$1 after failed matchUndefined capture
each on hashDeprecated 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.

Next read? 7.md, intro.md.

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.

Next read? 7.md, intro.md.


Связанные материалы

ТемаСсылка
Первая программа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.


Упражнения (история)

  1. Год первого CPAN upload.
  2. TMTOWTDI одним абзацем.
  3. Raku и Perl 5 в вакансиях.
  4. Однострочник: подсчёт строк в файле.
  5. Зачем use strict?