Язык Perl: что это, для чего нужен и как выглядит код

Язык Perl: что это, для чего нужен и как выглядит код Полезное

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

Ниже разберу, для чего Perl нужен на практике, как выглядит первый рабочий скрипт, чем сильны регулярные выражения, что означают сигилы $, @, % перед переменными, какие ошибки ловят новички и в каком состоянии язык находится в 2026 году. Весь код прогнан на Perl 5.34, вывод показан фактический.

Для чего нужен Perl

Perl задумывался как «клей» между программами и текстовыми потоками, отсюда и его сильные стороны. Основные сценарии, где он до сих пор уместен:

  • Обработка текста и логов. Разбор строк, извлечение полей, подсчет и агрегация. Это исходная специализация языка.
  • Регулярные выражения. Синтаксис регулярок Perl (PCRE) стал стандартом де-факто и перекочевал в другие языки.
  • Системное администрирование. Скрипты для бэкапов по расписанию, парсинга конфигов, автоматизации рутины на Unix-серверах.
  • Одноразовые скрипты-однострочники. Быстрая обработка файлов прямо из командной строки, без отдельной программы.
  • Легаси-веб и биоинформатика. Старые CGI-приложения и научные пайплайны (BioPerl), которые продолжают работать.

Для мобильной разработки, игр, фронтенда и типового современного бэкенда Perl не выбирают — там доминируют другие языки. Это честная граница применимости, а не универсальный инструмент.

Первый скрипт на Perl

Начну с минимального законченного скрипта, который можно скопировать и запустить. Он объявляет переменные трех основных типов и печатает результат:

use strict;
use warnings;

my $name = "Perl";                      # скаляр: одно значение
my @langs = ("Perl", "Python", "Bash"); # массив: список значений
my %versions = (Perl => "5.40", Python => "3.13"); # хеш: пары ключ-значение

print "Привет, $name!\n";
print "Языков в списке: ", scalar(@langs), "\n";
print "Версия Perl: $versions{Perl}\n";

Вывод в консоли:

Привет, Perl!
Языков в списке: 3
Версия Perl: 5.40

Теперь по строкам. use strict; и use warnings; — две директивы, с которых стоит начинать любой скрипт: они требуют объявлять переменные через my и предупреждают о подозрительных местах. Без них Perl прощает опечатки молча, и ошибку потом трудно найти (пример покажу ниже).

my $name объявляет локальную переменную. Сигил $ перед именем означает скаляр — одно значение (число или строку). @langs — массив, %versions — хеш (ассоциативный массив, пары ключ-значение). scalar(@langs) в скалярном контексте дает длину массива, поэтому печатается 3. Обращение $versions{Perl} берет одно значение из хеша, и сигил снова $, потому что достаем один элемент.

Сигилы переменных

Сигил — это ведущий символ перед именем, который задает тип структуры. Это ключевая особенность синтаксиса Perl, из-за нее код и выглядит непривычно.

Сигил Тип Пример объявления Что хранит
$ скаляр my $x = 42; одно значение: число, строку или ссылку
@ массив my @list = (1, 2, 3); упорядоченный список значений
% хеш my %h = (a => 1); пары ключ-значение

Тонкость: при доступе к одному элементу массива или хеша сигил меняется на $, потому что достаете скаляр: $list[0] (первый элемент массива), $h{a} (значение по ключу). Начинающие часто путают @list и $list[0] — это разные вещи, целый массив против одного его элемента.

Регулярные выражения — сильная сторона

Регулярные выражения встроены в язык на уровне синтаксиса, а не подключаются библиотекой. Оператор =~ связывает строку с шаблоном. Разберу типовую задачу: вытащить из строки числа, домен email и замаскировать сумму.

use strict;
use warnings;

my $text = 'Заказ 1024 от client@example.com, сумма 4990 руб';

my @numbers = $text =~ /(\d+)/g;   # все группы цифр, флаг g - найти все
print "Числа: @numbers\n";

if ($text =~ /(\S+)@(\S+\.\w+)/) { # захват имени и домена в $1 и $2
    print "Домен: $2\n";
}

(my $masked = $text) =~ s/\d+ руб/*** руб/; # s/// - замена по шаблону
print "$masked\n";

Вывод:

Числа: 1024 4990
Домен: example.com
Заказ 1024 от client@example.com, сумма *** руб

Здесь /(\d+)/g с флагом g возвращает все совпадения списком, скобки создают группы захвата. Оператор s/шаблон/замена/ меняет подстроку. Такой разбор строк на Perl пишется компактнее, чем на многих других языках, — это и есть его исходная ниша.

Обработка логов: пример посложнее

Типичная задача системного администратора — посчитать записи по уровням в лог-файле. Скрипт читает файл построчно и накапливает счетчики в хеше:

use strict;
use warnings;

my %count;
open(my $fh, '<', 'log.txt') or die "Не открыть файл: $!";
while (my $line = <$fh>) {
    if ($line =~ /\s(INFO|WARN|ERROR)\s/) {
        $count{$1}++;   # $1 - захваченный уровень, ++ увеличивает счетчик
    }
}
close($fh);

for my $level (sort keys %count) {
    print "$level: $count{$level}\n";
}

Для лога из двух INFO, двух ERROR и одного WARN вывод будет такой:

ERROR: 2
INFO: 2
WARN: 1

Ту же логику часто пишут вообще без файла-скрипта — одной строкой в терминале. Флаг -n оборачивает код в цикл по строкам ввода, -l добавляет перенос:

perl -lne '$c{$_}++; END { print "$_: $c{$_}" for sort keys %c }' log.txt

Три частые ошибки

Ошибка 1: символ @ в двойных кавычках. В строке с email @ воспринимается как начало массива:

use strict;
use warnings;
my $email = "client@example.com";
print "$email\n";

Под use strict это падает при компиляции:

Possible unintended interpolation of @example in string
Global symbol "@example" requires explicit package name ...

Исправление — одинарные кавычки (в них нет интерполяции) или экранирование: my $email = 'client@example.com'; либо "client\@example.com".

Ошибка 2: == для сравнения строк. Оператор == в Perl сравнивает числа, а строки — оператор eq. Легко перепутать:

use strict;
use warnings;
my $answer = "yes";
if ($answer == "yes") { print "совпало\n"; }

С use warnings Perl предупреждает и дает неверный результат:

Argument "yes" isn't numeric in numeric eq (==)
совпало

Строка «yes» в числовом контексте становится 0, сравнение 0 == 0 истинно, поэтому «совпало» печатается ошибочно. Исправление — строковый оператор: if ($answer eq "yes").

Ошибка 3: опечатка в имени без use strict. Без строгого режима опечатка тихо создает новую переменную:

my $total = 0;
$total = $total + 100;
$totl  = $totl + 50;   # опечатка: $totl вместо $total
print "Сумма заказа: $total руб\n";

Скрипт не падает, но выводит неверную сумму:

Сумма заказа: 100 руб

Прибавка 50 ушла в переменную-призрак $totl, а $total осталась 100 вместо 150. Исправление — всегда ставить use strict; use warnings;: тогда та же опечатка ловится сразу с сообщением Global symbol "$totl" requires explicit package name.

Актуальность Perl в 2026

Живая ветка языка — Perl 5: она активно развивается, релиз 5.40 вышел в 2024 году, обратная совместимость сохраняется. Огромный репозиторий модулей CPAN тоже жив и остается сильной стороной экосистемы.

Отдельная тема — Perl 7. Его анонсировали в 2020 году как «Perl 5 с современными настройками по умолчанию», но на момент подготовки статьи стабильный релиз Perl 7 не вышел, а планы по нему менялись. Считать Perl 7 доступной версией нельзя — это скорее заявленное направление, чем факт. Актуальный статус стоит проверять на perl.org перед тем, как на него ссылаться.

Честно про нишевость: Perl уступил массовые задачи Python и другим языкам, его доля в рейтингах популярности невелика и снижается годами. Как первый язык для новичка он неудачен — синтаксис с сигилами и «есть больше одного способа сделать» усложняют вход. Но мертвым он не является: там, где нужно быстро перемолоть текст или поддержать существующий скрипт на Unix-сервере, Perl по-прежнему уместен.

Выводы

  • Perl — интерпретируемый язык общего назначения, чья сильная сторона в 2026 году — обработка текста, регулярные выражения и системные скрипты, а не новые крупные приложения.
  • Тип переменной задается сигилом: $ для скаляра, @ для массива, % для хеша; при доступе к одному элементу сигил становится $.
  • Регулярные выражения встроены в синтаксис через операторы =~ и s///, что делает разбор строк компактным.
  • Директивы use strict; use warnings; ловят опечатки и типовые ошибки на этапе компиляции — ставить их стоит в каждом скрипте.
  • Живая ветка — Perl 5 (релиз 5.40, 2024); статус Perl 7 на 2026 год не определен, его стоит уточнять отдельно.

Где применяется / связь с практикой

На практике Perl чаще всего встречается администраторам Linux-серверов: разобрать лог, собрать отчет по крону, склеить вывод одной утилиты со входом другой. Это работа на стыке командной строки, регулярных выражений и файловой системы, и базовые навыки Linux тут важнее, чем сам язык.

Освойте тему на практике

Освоить командную строку, права доступа, процессы и скриптинг, внутри которого Perl-однострочник становится рабочим инструментом, можно на курсе linux-basic в Otus. Посмотреть формат занятий и уровень до оплаты помогут бесплатные вебинары — там разбирают конкретные задачи и отвечают на вопросы.

Смежные темы: Язык Ruby: что это такое и зачем он необходим, Императивная разработка: характеристики и ее особенности, Введение в программирование.

FAQ

Как узнать версию установленного Perl?
Команда perl -v в терминале печатает версию интерпретатора. На macOS и большинстве дистрибутивов Linux Perl предустановлен; на Windows его ставят отдельно, распространенный бесплатный вариант — Strawberry Perl.

В чем разница между Perl и PHP, раз оба про веб?
PHP изначально заточен под генерацию веб-страниц и остается языком веб-бэкенда. Perl — язык общего назначения с упором на обработку текста; в вебе он сегодня встречается в основном в старых CGI-приложениях, а не в новых проектах.

Стоит ли учить Perl в 2026 году как первый язык?
Как первый — скорее нет: для старта проще Python. Perl имеет смысл осваивать точечно, если вы работаете с легаси-кодом на нем или с Unix-администрированием, где ценятся быстрые текстовые скрипты.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)