2012-06-03 2 views
4

У меня есть скрипт на языке Perl, который вызывает в другой PERL скрипт с помощью системы()Perl - используя обратные кавычки вместо системы()

это как:

my $returnval= system("perl", $path,$val1, $val2,@myarray); 

Поскольку система() возвращает только выход статус, но я хочу, чтобы выход скрипта я хотел использовать backticks.

Я пытался что-то вроде этого:

my $returnval = `$path`; 

, как я могу добавить параметры скрипт должен получать?

Как должен выглядеть код возврата другого Perl-скрипта? На данный момент это как

exit ($myreturnedvalue); 

(how) Можно ли вернуть несколько значений?

+0

К сожалению, я не понимаю вопроса о возврате нескольких значений. Вы уточните? – thb

+0

Я хочу вызвать скрипт с параметрами, тогда я хочу, чтобы вывод скрипта и этот вывод, это должно быть одно значение или может быть массивом или двумя параметрами, такими как exit (x1, x2) – Tyzak

+0

Вы можете вернуть только кусок текста (или двоичные данные). Если вам нужно несколько значений, тогда сценарий, который вы вызываете, должен возвращать сериализованную структуру данных (пробел, JSON, XML и т. Д.), Которые вы анализируете на своем Perl. – Quentin

ответ

5

Чтобы пройти через оболочку, чтобы переместить данные из одного Perl-скрипт для другого - не лучшее решение. Вы должны знать, что backticks или qx() захватывает все, что печатается в STDOUT. Использование exit ($var) из другого сценария вряд ли будет зафиксировано должным образом. Вам понадобится print $var. Но не делайте этого.

Вместо этого сделайте другой скрипт в модуле и напрямую используйте подпрограмму. Это упрощенный пример:

В bar.pm:

use strict; 
use warnings; 

package bar; # declare our package 

sub fooz {    # <--- Our target subroutine 
    my $in = shift; # passing the input 
    return $in * 5; # return value 
} 
1; # return value must be true 

В main.pl:

use strict; 
use warnings; 
use bar; # bar.pm must be in one path in @INC 

my $foo = bar::fooz(12); # calling fooz from our other perl script 
print "Foo is $foo\n"; 

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

1

Не делает ли это то, что вы хотите?

my $returnval = `$path $val1 $val2 @myarray`; 

@Quentin однако добавляет этот полезный совет: Если значение, которое вы хотите передать это foo "bar то в оболочке вы должны сделать что-то вроде "foo \"bar". Использование дополнительных аргументов для системы возьмет карту для вас. Использование backticks не будет; вам нужно создать команду оболочки, которую вы хотите вручную.

+0

Это не будет автоколлекция/избежать аргументов – Quentin

+0

@Quentin: Спасибо за совет. Я признаю, что я не знаю, что такое автовычисление. Быстрый grep через мои персонажи Perl появляется три, загадочные, проходящие ссылки на «автовычисление» или «авто-цитирование», но это не объясняет; ни веб-поиск не сразу становится чем-то очень информативным. Если вы можете сэкономить минуту, не могли бы вы объяснить немного дальше? Благодарю. – thb

+0

Я пробовал это, и после этого я пробовал '$ path/$ val1/$ val2/@ myarray', оба не работали:> – Tyzak

3

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

[email protected]:~$ ./script.pl --key=value 

Это в основном так же, как

my $returnval = `./script.pl --key=value`; 
+0

Что вы имеете в виду --key = value? – Tyzak

+0

Это был просто пример прохождения параметров. Замените его всем, что применимо для вашего скрипта; в основном '$ val1 $ val2' ... – mjhennig

2

Для вызова других программ, передающих аргументы и одновременной записи вывода, я являюсь большим поклонником IPC::Run:

use IPC::Run 'run'; 

my $exitcode = run [ $command, @args ], ">", \my $output; 

# $exitcode contains the exit status and 
# $output contains the command's STDOUT data 
+0

Вместо' IPC :: Run', 'IPC :: Cmd' обеспечивает аналогичную функциональность и является основным модулем. – Eponymous

3

IPC::System::Simplecapturex.

use IPC::System::Simple qw(capturex); 
my $output = capturex("perl", $path, $val1, $val2, @myarray); 

Он даже обрабатывает ошибки для вас.

+1

Почему -1? ОП запросил версию обратной связи, в которой команда не подвержена интерпретации оболочки, и это именно то, что «capturex». – ikegami

Смежные вопросы