Как я могу передать аргументы из одного сценария Perl в другой? - PullRequest
2 голосов
/ 27 мая 2009

У меня есть скрипт, который я запускаю, и после его запуска у него есть некоторая информация, которую мне нужно передать следующему скрипту для запуска.

Команды Unix / DOS выглядят так:

perl -x -s param_send.pl
perl -x -s param_receive.pl

param_send.pl:

# Send param

my $send_var = "This is a variable in param_send.pl...\n";
$ARGV[0] = $send_var;
print "Argument: $ARGV[0]\n";

param_receive.pl:

# Receive param

my $receive_var = $ARGV[0];
print "Parameter received: $receive_var";

Но ничего не напечатано. Я знаю, что делаю это неправильно, но из учебников я не могу понять, как передать параметр из одного сценария в другой!

Большое спасибо заранее.

Ответы [ 5 ]

8 голосов
/ 27 мая 2009

Вы можете использовать символ канала в командной строке, чтобы подключить стандартный вывод из первой программы к стандартному вводу во второй программе, который затем можно записать (используя print) или прочитать (используя оператор <>) .

perl param_send.pl | perl param_receive.pl

Если вы хотите, чтобы выходные данные первой команды были аргументами второй команды, вы можете использовать xargs:

perl param_send.pl | xargs perl param_receive.pl
2 голосов
/ 27 мая 2009

@ARGV создается во время выполнения и не сохраняется. Таким образом, ваш второй сценарий не сможет увидеть $ARGV[0], назначенный вами в первом сценарии. Как указывает crashmstr , вам либо нужно выполнить второй скрипт из первого, используя для этого один из много методов . Например:

my $send_var = "This is a variable in param_send.pl...\n";
`perl param_receive.pl $send_var`;

или используйте переменную окружения, используя% ENV:

my $send_var = "This is a variable in param_send.pl...\n";
$ENV['send_var'] = $send_var;
1 голос
/ 27 мая 2009

Хэш % ENV в Perl содержит переменные среды, такие как PATH, USER и т. Д. Любые изменения этих переменных отражаются «только» в текущем процессе и любом дочернем процессе, который он может порождать. Родительский процесс (который в данном конкретном случае является оболочкой) не отражает эти изменения, поэтому при завершении сценария 'param_send.pl' все изменения теряются.

Например, если бы вы делали что-то вроде

#!/usr/bin/perl
# param_send.pl
$ENV{'VAL'} = "Value to send to param_recv";


#!/usr/bin/perl
# param_recv.pl
print $ENV{'VAL'};

Это не сработает, поскольку VAL теряется при выходе из param_send. Одним из обходных путей является вызов param_recv.pl из param_send.pl и передача значения в качестве переменной среды или аргумента

#!/usr/bin/perl
# param_send.pl
$ENV{'VAL'} = "Value to send to param_recv";
system("perl param_recv.pl");

OR

#!/usr/bin/perl
# param_send.pl
system("perl param_recv.pl 'VAL'");

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

0 голосов
/ 04 декабря 2010

Для более продвинутых решений подумайте об использовании сокетов или IPC .

0 голосов
/ 27 мая 2009

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

Ваши переменные ARGV предназначены только для текущего запущенного скрипта, поэтому вы не можете использовать его для передачи чего-либо от одного к другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...