Могу ли я передать @ARGV и параметры скрипту perl, вызываемому с помощью do?

#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 .