#perl
Вопрос:
У меня есть скрипт, который обрабатывает @ARGV
и опционально (через Getopt::Длинный::Описательный).
Теперь я также хотел бы вызвать тот же сценарий из другой программы perl и передать ему переменные.
Одним из решений является использование system
и построение аргументов , передаваемых соответствующим образом, следующим образом:
system("perl my_script.pl", qw/--foo bar --baz 2/);
Мой вопрос: могу ли я получить тот же результат, вызвав скрипт через do
?
Я пытаюсь сделать это, потому что сценарий будет выполняться в очереди заданий Minion, поэтому я бы избегал каждый раз создавать экземпляр perl, что часто вызывает проблемы с нехваткой памяти.
Комментарии:
1. Afaik нет, но вы можете
open my $fh, "-|", qw(executable, ..args )
и считывать вывод через$fh
дескриптор.2. Почему вы хотите использовать
do
? Это не обычное требование.3. @briandfoy — Я пытаюсь использовать те же сценарии, которые я использую в командной строке, которые основаны на GetOpt::Long::Описании, а также в качестве задач Minion (очередь заданий Mojolicious) без необходимости переписывать все это(ы). Плохая идея?
4. Да, это плохая идея. То, что вы
do
топчете ногами, независимо от того, что делает ваша программа. Почему былsystem
неадекватен?5. @briandfoy
system
порождает экземпляр perl с каждым сценарием, что иногда вызывает OOM. Я подумалdo
, что это сэкономит некоторые накладные расходы. Кстати, и сценарий Getopt, и сервер Minion — это то, что я пишу, — не знаю, поможет ли это. Я надеялся/думал достичь чего — то похожего на modulinos-одна вещь, которая выполняет две работы
Ответ №1:
ответ раджашекара правильный, но я бы также добавил, что вы можете установить аргументы для дочернего сценария в local
блоке, чтобы ребенку не нужно было повреждать @ARGV
родительский.
{
local @ARGV = ("--foo","bar","--baz",$ARGV[3]);
do 'my_script.pl';
}
# previous @ARGV restored at end of block
Ответ №2:
Вы можете установить @ARGV
его самостоятельно, а затем оценить файл сценария.
Это сработает
@ARGV = qw(--foo --bar).
do $script_file;
Поскольку @ARGV
это глобальная переменная, она также доступна внутри do
. Но если вы хотите получить доступ к любым локальным переменным, которые вы определили, то вы можете использовать:
eval `cat $script_file`;
РЕДАКТИРОВАТЬ: Я ошибочно предположил, что @ARGV
это будет недоступно внутри do
.