2009-05-27 1 views
2

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

командует 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";

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

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

+0

Каждый копирует ваши ключи -x и -s, даже если они ничего не делают в этих программах. –

ответ

0

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

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

+0

Окружающая среда передается от родительского процесса к дочернему процессу, так что это не сработает. Родительский (shell) процесс не увидит изменений, которые ребенок (perl) сделал в своей среде. – ijw

+0

Как я уже сказал, я не человек perl, но я знаю, что вы можете сделать это на других языках и/или с функциями ОС. – crashmstr

+0

Если код не работает в том же процессе, вы никогда не увидите изменений в среде. Это не Perl, это POSIX. –

7

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

perl param_send.pl | perl param_receive.pl 

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

perl param_send.pl | xargs perl param_receive.pl 
+0

Это решение, похоже, делает именно то, что мне нужно. Благодаря! Я могу свободно передавать параметры из скрипта param_send в скрипт param_receive. Еще раз спасибо. – 2009-05-27 15:29:17

2

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

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

%ENV хэш в Perl хранит переменные среды, такие как PATH, пользователь, и т.д. Любые модификации этих переменных отражается «только» в текущем процессе и любой дочерний процесс, который он может порождать. Родительский процесс (который является оболочкой в ​​данном конкретном экземпляре) не отражает эти изменения, поэтому, когда скрипт «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.пл и передать значение в качестве переменной окружения или аргумента,

#!/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 node для более эзотерической решения.