Местоположение вашего текущего интерпретатора Perl можно найти в специальной переменной $^X
. Это важно, если perl не находится на вашем пути, или если у вас есть несколько доступных версий perl, но чтобы убедиться, что вы используете одну и ту же версию по всем направлениям.
При выполнении внешних команд, включая другие программы Perl, определить, действительно ли они выполнялись, может быть довольно сложно. Проверка $?
может оставить стойкие психические шрамы, поэтому я предпочитаю использовать IPC :: System :: Simple (доступно из CPAN):
use strict;
use warnings;
use IPC::System::Simple qw(system capture);
# Run a command, wait until it finishes, and make sure it works.
# Output from this program goes directly to STDOUT, and it can take input
# from your STDIN if required.
system($^X, "yourscript.pl", @ARGS);
# Run a command, wait until it finishes, and make sure it works.
# The output of this command is captured into $results.
my $results = capture($^X, "yourscript.pl", @ARGS);
В обоих приведенных выше примерах любые аргументы, которые вы хотите передать своей внешней программе, входят в @ARGS
. Оболочку также избегают в обоих приведенных выше примерах, что дает небольшое преимущество в скорости и позволяет избежать нежелательных взаимодействий, связанных с метасимволами оболочки. Приведенный выше код также ожидает, что ваша вторая программа вернет нулевое значение выхода, чтобы указать успех; если это не так, вы можете указать дополнительный первый аргумент допустимых значений выхода:
# Both of these commands allow an exit value of 0, 1 or 2 to be considered
# a successful execution of the command.
system( [0,1,2], $^X, "yourscript.pl", @ARGS );
# OR
capture( [0,1,2, $^X, "yourscript.pl", @ARGS );
Если у вас длительный процесс и вы хотите обработать его данные , пока он генерируется, то вам, вероятно, понадобится открытый канал или один из более тяжелых модулей IPC из CPAN.
Сказав все это, каждый раз, когда вам нужно будет вызывать другую Perl-программу из Perl, вы можете подумать, будет ли лучше использовать модуль. Запуск другой программы влечет за собой немало накладных расходов, как с точки зрения затрат на запуск, так и затрат на ввод / вывод для перемещения данных между процессами. Это также значительно увеличивает сложность обработки ошибок. Если вы можете превратить вашу внешнюю программу в модуль, вы можете обнаружить, что это упрощает ваш общий дизайн.
Всего наилучшего,
Пол