Однострочники 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 нередко умещается в одну команду.