Perl — мастер-скрипт, вызывающий субскрипты и возвращающий статус

Вот дизайн, который я хочу реализовать на Perl:

Главный сценарий вызывает несколько подчиненных сценариев. Главный сценарий управляет вызовом каждого нижнего сценария в определенной последовательности и записывает выходные данные каждого нижнего сценария, чтобы решить, не вызывать ли следующий сценарий.

В настоящее время у меня есть мастер-скрипт, который вызывает суб-скрипт с помощью вызова system(), но у меня возникают проблемы с тем, чтобы суб-скрипт сообщал статус обратно мастер-скрипту.

Не хотите использовать подфункции, очень хотелось бы, чтобы каждый код нижнего скрипта был отдельным.

Чтобы пролить больше света на проблему: нижний сценарий должен решать, что сообщать основному сценарию. Например: субскрипт отправляет код 1, когда субскрипт находит строковое значение в базе данных, он отправляет код 2, когда субстрока не находит искомый файл, и отправляет код 0, когда все идет хорошо.


person Chris    schedule 27.01.2011    source источник
comment
Хотя это и не ответ на вопрос, вы можете рассмотреть свою реализацию здесь. Вы могли бы сделать то же самое, но более надежно, с меньшим объемом памяти и без системных вызовов, если бы использовали модули для другой функциональности. Вы можете сделать так, чтобы каждый модуль имел нужную вам функцию или поведение. Для тех сценариев, которые должны оставаться отдельными, у вас может быть сценарий-оболочка вокруг этого модуля, который вызывает метод(ы) модуля. Затем для этого «главного» сценария вы просто используете все модули и вызываете функции в каждом из них, передавая результаты обратно как переменные вместо возвращаемых значений.   -  person Robert P    schedule 28.01.2011
comment
Да, в конечном итоге я определенно хотел бы пойти по этому пути, есть ли хороший ресурс, который вы можете мне указать, чтобы узнать больше о модулях в Perl?   -  person Chris    schedule 28.01.2011
comment
perldoc.perl.org/perlmod.html . Кроме того, пара туториалов по ООП здесь: perldoc.perl.org/index-tutorials.html   -  person DVK    schedule 28.01.2011


Ответы (3)


Разве вы не можете просто использовать коды exit для этого?

my $code = system( 'perl', '-e', 'exit 2;' ) >> 8; # $code = 2
say "\$code=$code";

Коды выхода могут иметь 255 различных значений.

person Axeman    schedule 27.01.2011

Вы можете выполнять и записывать выходные данные системных команд с синтаксисом обратной кавычки.

# get result as scalar
$result = `ls -lA`;

# get the result as an array, each line of output is a separate array entry
@result = `ls -lA`;

Всякий раз, когда вы используете синтаксис обратной кавычки, статус выхода команды также сохраняется в автоматической переменной $?

Затем вы можете сделать так, чтобы мастер-скрипт решил, хорош ли вывод или нет, используя любую логику, которая вам нужна.

person Karew    schedule 27.01.2011
comment
Использование обратной кавычки фиксирует все, что печатается в нижнем индексе. То, что я ищу, в основном отправляет статус выхода, за исключением того, что статус выхода может быть более чем двумя различными значениями, которые установлены в индексе - person Chris; 28.01.2011
comment
Используйте переменную $?, чтобы зафиксировать статус выхода, как указано выше. Вы можете просто отказаться от вывода тогда. Это требует, чтобы индексы передавали реальный статус, используя exit() Perl. - person Karew; 28.01.2011