Однострочники Perl (one-liners)

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

Однострочник (one-liner) — короткая программа на Perl, которая целиком помещается в одну команду терминала и запускается без сохранения в отдельный файл.

Зачем это нужно

Из прошлого урока ты знаешь, как написать программу на Perl, которая читает файл, ищет строки и вытаскивает из них данные. Но что, если задача разовая — нужно один раз посчитать что-то в файле и забыть об этом? Создавать отдельный .pl-файл, открывать редактор, сохранять, запускать — долго для такой мелочи.

Именно здесь Perl проявляет себя как любимый инструмент системных администраторов. У него есть ключ командной строки -e («execute», выполнить), который позволяет написать программу прямо в терминале, без единого файла. За десятилетия использования сложился целый набор знаменитых приёмов — их называют однострочниками, и они до сих пор экономят массу времени тем, кто работает с текстом и логами.

Простейший однострочник

Команда perl -e запускает Perl и выполняет код, переданный сразу следом в кавычках.

perl -e 'print "Привет, терминал!\n";'

Вывод:

Привет, терминал!

Здесь всё, что находится между одинарными кавычками — это обычный код Perl, будто он лежит в файле. Просто вместо запуска perl script.pl мы передаём текст программы прямо аргументом.

Ключ -n: обработать файл построчно без цикла

Писать while (my $line = <$fh>) в однострочнике неудобно — слишком длинно. Поэтому у Perl есть ключ -n, который сам оборачивает код в цикл чтения по строкам из файла, переданного следующим аргументом.

perl -ne 'print if /ERROR/' server.log

Вывод:

2026-06-30 09:12:15 ERROR Не удалось подключиться к базе данных
2026-06-30 09:47:33 ERROR Таймаут запроса к API

Смотри, как компактно: -ne — это два ключа сразу, -n (обернуть код в чтение по строкам) и -e (вот сам код). Внутри код всего одна конструкция: print if /ERROR/ — «напечатать текущую строку, если она содержит ERROR». Обрати внимание, что здесь даже не нужно явно писать, какую строку печатать — Perl держит её в специальной переменной по умолчанию $_, и команды вроде print и проверка /ERROR/ используют её автоматически, если не указано другое.

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

Ключ -p: обработать и вывести автоматически

Ключ -p похож на -n, но добавляет ещё одну удобную вещь: после каждой обработанной строки Perl сам печатает $_. Это идеально для задачи «замени что-то в каждой строке файла».

perl -pe 's/ERROR/ОШИБКА/g' server.log

Вывод:

2026-06-30 09:12:01 INFO  Пользователь user42 вошёл в систему
2026-06-30 09:12:15 ОШИБКА Не удалось подключиться к базе данных
2026-06-30 09:13:02 INFO  Пользователь user17 вышел из системы
2026-06-30 09:47:33 ОШИБКА Таймаут запроса к API

Конструкция s/ERROR/ОШИБКА/g — это оператор замены (substitution): найти ERROR и заменить на ОШИБКА. Буква g в конце означает «global» — заменить все вхождения в строке, а не только первое. Ключ -p берёт на себя и чтение строк, и их печать — тебе остаётся описать только саму замену.

Собираем статистику: подсчёт вхождений

Однострочники умеют не только печатать строки, но и копить результат по ходу обработки всего файла — например, посчитать общее число ошибок.

perl -ne '$count++ if /ERROR/; END { print "Ошибок: $count\n" }' server.log

Вывод:

Ошибок: 2

Тут появляется новая деталь — блок END { ... }. Он выполняется один раз, после того как все строки файла уже обработаны. Пока идёт построчная обработка (за счёт -n), переменная $count увеличивается на единицу при каждом совпадении с ERROR. А когда файл заканчивается, срабатывает END и печатает итог. Так однострочник превращается в маленький, но настоящий счётчик статистики — без единого сохранённого файла с кодом.

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

  • Перепутать одинарные и двойные кавычки в терминале. Код Perl принято оборачивать одинарными кавычками '...', чтобы командная оболочка (bash) не пыталась сама подставлять в него переменные вроде $count — иначе оболочка решит, что это её собственная переменная, и подставит пустоту вместо кода Perl.
  • Забыть ключ -n или -p и удивляться, что файл не читается. Без одного из этих ключей код Perl выполнится один раз, а не для каждой строки — файл нужно явно указать и обработать самому, обычного цикла по умолчанию нет.
  • Спутать -n и -p. -n ничего не печатает сама — печать нужно вызывать явно (print). -p печатает $_ автоматически после каждой строки. Если использовать -p там, где нужен только подсчёт без вывода всех строк, на экран посыплется лишний текст.
  • Забыть букву g в замене. Без неё s/ERROR/ОШИБКА/ заменит только первое найденное совпадение в строке, а не все.

Итоги

  • perl -e 'код' запускает код Perl прямо из терминала, без отдельного файла.
  • Ключ -n оборачивает код в чтение файла по строкам, ключ -p делает то же самое и вдобавок автоматически печатает каждую обработанную строку.
  • Специальная переменная $_ хранит «текущую» строку по умолчанию — большинство команд Perl работают с ней без явного указания.
  • Блок END { ... } выполняется один раз после обработки всего файла — удобно для подведения итогов и статистики.
  • Однострочники — не игрушка, а рабочий инструмент: то, на что в других языках ушёл бы отдельный скрипт, в Perl нередко умещается в одну команду.
Проверьте себя
1. Чем ключ -p отличается от ключа -n в команде perl?
AНичем, это одно и то же
B-p дополнительно автоматически печатает строку $_ после обработки, а -n — нет
C-n работает только с числами, а -p только с текстом
D-p запускает код быстрее, чем -n
2. Что произойдёт при выполнении perl -ne '$count++ if /ERROR/; END { print "$count\n" }' log.txt?
AПрограмма выведет содержимое всего файла
BПрограмма один раз в конце выведет число строк, содержащих ERROR
CПрограмма удалит все строки с ERROR из файла
DПрограмма выведет $count после каждой строки файла