Насколько я понимаю (Perl для меня новичок) Perl можно использовать для написания скриптов в командной строке Unix. Я хочу выполнить (жестко запрограммированные) вызовы командной строки и искать в выводе этих вызовов совпадения с регулярным выражением. Есть ли способ сделать это просто в Perl? Как?
Обновлено: Последовательность здесь: -Звоните другую программу. -Запустить регулярное выражение для его вывода.





#!/usr/bin/perl
sub my_action() {
print "Implement some action here\n";
}
open PROG, "/path/to/your/command|" or die $!;
while (<PROG>) {
/your_regexp_here/ and my_action();
print $_;
}
close PROG;
Это просканирует вывод вашей команды, сопоставит регулярные выражения и выполнит какое-то действие (которое теперь печатает строку)
При этом не выполняется никаких «(жестко запрограммированных) вызовов командной строки», а просто читается и действует стандартный ввод.
Вам вообще нужен Perl? Как насчет
command -I use | grep "myregexp" && dosomething
прямо в оболочке?
Это будет происходить сотни раз, и я собираюсь добавить выходной файл, так что да. Но ваша команда очень похожа на ту, которую будет использовать Perl: P
для выходного файла «галстук». Но сотни раз ... Может быть, Perl.
В Perl вы можете использовать обратные кавычки для выполнения команд в оболочке. Вот документ об использовании обратных кавычек. Я не уверен, как записать вывод, но уверен, что есть больше, чем способ сделать это.
my $command = "ls -l /";
my @output = `$command`;
for (@output) {
print if /^d/;
}
Оператор квази-цитирования qx// (для которого обратные кавычки являются ярлыком) украден из синтаксиса оболочки: запустить строку как команду в новой оболочке и вернуть ее вывод (как строку или список, в зависимости от контекста). Подробнее см. perlop.
Также можно открыть трубу:
open my $pipe, "$command |";
while (<$pipe>) {
# do stuff
}
close $pipe;
Это позволяет вам (а) не собирать весь вывод команды в память сразу, и (б) дает вам более точный контроль над выполнением команды. Например, вы можете избежать синтаксического анализа команды оболочкой:
open my $pipe, '-|', @command, '< single argument not mangled by shell >';
См. perlipc для более подробной информации.
Или как я это реализовал: for (@output) {my_action () if / regex /; } Позволяя мне делать все, что я захочу, если я получу удар. Спасибо!
Возможно, вам удастся обойтись без Perl, как упоминали другие. Однако, если вам нужна какая-то функция Perl, такая как расширенные функции регулярных выражений или дополнительные манипуляции с текстом, вы можете перенаправить свой вывод на perl, а затем делать то, что вам нужно. Переключатель Perl -e позволяет вам указать программу Perl в командной строке:
command | perl -ne 'print if /.../'
Есть несколько других переключателей, которые вы можете передать Perl, чтобы сделать его очень мощным в командной строке. Они задокументированы в Perlrun. Также посмотрите некоторые статьи в Колонка Рэндала Шварца "Обзор Unix", особенно его первая статья для них. Вы также можете найти в Google множество примеров для Вкладыши Perl One.
Разве вы не пропустили здесь флаг -n?
Вы действительно используете однострочник в таком случае. Недавно я составил код, который я использую, среди прочего, для создания вывода, в котором перечисляется структура каталогов, присутствующая в архиве .zip (одна запись в каталоге на строку). Таким образом, используя этот вывод в качестве примера вывода команды, который мы хотели бы отфильтровать, мы могли бы вставить канал, а затем использовать perl с флагами -n -e для фильтрации входящих данных (и / или делать с ним другие вещи):
[command_producing_text_output] | perl -MFile::Path -n -e \
"BEGIN{@PTM=()} if (m{^perl/(bin|lib(?!/site))}) {chomp;push @PTM,$_}" ^
-e "END{@WDD=mkpath (\@PTM,1);" ^
-e "printf qq/Created %u dirs to reflect part of structure present in the .ZIP file\n/, scalar(@WDD);}"
используемый синтаксис оболочки, в том числе: цитирование кода Perl и экранирование новой строки, отражает использование CMD.exe в консолях, подобных Windows NT. Если нужно, мысленно замените «^» с «\» и «с» в соответствующих местах.
Приведенный выше однострочник добавляет только те имена каталогов, которые начинаются с «perl / bin» или "perl / lib (без" / site "); затем он создает эти каталоги. вверх с (пустым) деревом, которое вы можете использовать для любых злых целей.
Главное - показать, что есть флаги (-n, -p) для
позволяют Perl перебирать каждую входную запись (строку), и то, что вы можете делать, неограниченно с точки зрения сложности.
возможно, было бы лучше заменить оператор печати блоком do.