2016-01-27 6 views
2

Я пишу большой скрипт Perl, который должен использовать другие существующие скрипты Perl. Проблема заключается в том, что основной скрипт должен ссылаться на множество разных сценариев из разных папок. Например, основной скрипт будет содержаться в:Как сделать скрипт perl запустить другой скрипт perl?

/perl/programs/io 

Это может понадобиться запустить скрипт, который хранится в:

/perl/programs/tools 

Обратите внимание, что существуют другие ортогональные папки, кроме инструментов, поэтому я должен быть доступ к любому из них на лету.

В настоящее время это то, что я получил:

my $mynumber = '../tools/convert.pl bin2dec 1011'; 

В теории он должен вернуться из каталога Io затем введите соответствующий каталог инструмента и вызовите convert.pl скрипт при прохождении его параметров.

Все это делает сохранение строки в одинарных кавычках до $myNumber.

+5

Uhhh ... вы просто назначаете строку переменной. Возможно, вы хотели использовать [backticks] (http://perldoc.perl.org/perlop.html#%60_STRING_%60)? –

+3

Возможный дубликат [Как запустить скрипт Perl из скрипта Perl?] (Http://stackoverflow.com/questions/364842/how-do-i-run-a-perl-script-from-within- a-perl-script) –

+0

@MattJacob да, но принятый ответ для этого случая немного переборчив. – simbabque

ответ

1

Чтобы запустить любую системную команду или сценарий все, что вам нужно сделать, это использовать `backticks`. Из наблюдений за другим кодом программиста я неправильно понял эти странные цитаты для «одиночных кавычек».

обратные ссылки также хороши, потому что они возвращают текст в STDOUT для вашего скрипта perl, так что вывод может быть назначен переменной, что я нашел невозможным при использовании системы ("");

1

Подобный вопрос ответ не работает с моей версией perl. Линия

use IPC::System::Simple qw(system capture); 

вызывает некоторые ошибки. Однако только с помощью системных работ, например:

my $mynumber = system($^X, "../tools/convert.pl", 'bin2dec', '1011'); 

я могу использовать выше, не приравнивая к чему-то, чтобы выполнять сценарии, которые не возвращают никакого значения и только посланные аргументы.

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

1

Мне нравится назначать вывод команды массиву, чтобы я мог перебирать массив, чтобы найти ошибку или другие сообщения. Например, если я делаю zip-файл по электронной почте кому-то, я хочу проверить, не было ли у почтовой программы каких-либо ошибок до того, как я продолжу делать и отправлять электронное письмо.

@msgs = `zip -f myfile.zip *.pl`; # Use backticks 

Вы также можете назначить выход на скаляр:

$msg = `ls -al *.pl`; # Use backticks 
Смежные вопросы