perl - использование обратных кавычек вместо system ()

У меня есть сценарий Perl, который вызывает другой сценарий Perl с помощью system ()

это как:

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

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

Я пробовал что-то подобное:

my $returnval = `$path`;

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

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

exit ($myreturnedvalue);

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


person Tyzak    schedule 03.06.2012    source источник
comment
К сожалению, я не понимаю вопроса о возврате нескольких значений. Не могли бы вы прояснить?   -  person thb    schedule 03.06.2012
comment
Я хочу вызвать сценарий с параметрами, затем мне нужен вывод сценария и этот вывод, должно ли это быть одно значение или это может быть массив или два параметра, например exit (x1, x2)   -  person Tyzak    schedule 03.06.2012
comment
Вы можете вернуть только фрагмент текста (или двоичные данные). Если вам нужно несколько значений, то вызываемый вами скрипт должен возвращать сериализованную структуру данных (разделенных пробелами, JSON, XML и т. Д.), Которую вы анализируете в своем Perl.   -  person Quentin    schedule 03.06.2012
comment
ах, хорошо, так что мне нужно поработать над текстом для извлечения нужной информации, спасибо :)   -  person Tyzak    schedule 03.06.2012
comment
Вы пытаетесь использовать функции Perl не только в файле внутри программы, или вы изо всех сил пытаетесь понять, как использовать $? в своей программе? $output = ˋcmd arg1 arg2ˋ; $status = $?; получает и вывод, и состояние отдельно.   -  person tchrist    schedule 04.06.2012


Ответы (5)


Перенести данные из одного perl-скрипта в другой через оболочку - не лучшее решение. Вы должны знать, что обратные кавычки или 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";

Есть еще много чего узнать, и я предлагаю вам ознакомиться с документацией.

person TLP    schedule 03.06.2012

Вам нужен capturex от IPC :: System :: Simple.

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

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

person ikegami    schedule 03.06.2012
comment
Почему -1? OP запросил версию обратных кавычек, в которой команда не подлежит интерпретации оболочки, и это именно то, что capturex. - person ikegami; 04.06.2012

Обратные кавычки просто работают как прямой вызов в оболочке:

you@somewhere:~$ ./script.pl --key=value

В основном то же самое, что и

my $returnval = `./script.pl --key=value`;
person mjhennig    schedule 03.06.2012
comment
что вы имеете в виду с --key = value? - person Tyzak; 03.06.2012
comment
Это был просто пример передачи параметров. Замените его чем-нибудь подходящим для вашего скрипта; в основном $val1 $val2 ... - person mjhennig; 03.06.2012


Разве это не то, что вы хотите?

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

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

person thb    schedule 03.06.2012
comment
Он не будет автоматически цитировать / избегать аргументов - person Quentin; 03.06.2012
comment
@Quentin: Спасибо за совет. Признаюсь, что не знаю, что такое автокотирование. Быстрый поиск с помощью команды grep на моих страницах руководства Perl обнаруживает три загадочных передающих ссылки на автоматическое цитирование или автоматическое цитирование, но они не объясняют; и при этом поиск в Интернете не дает сразу ничего очень информативного. Если вы можете уделить немного времени, не могли бы вы объяснить немного подробнее? Спасибо. - person thb; 03.06.2012
comment
Я попробовал это, а потом попробовал $path /$val1 /$val2 /@myarray, оба не сработали: › - person Tyzak; 03.06.2012
comment
Если значение, которое вы хотите передать, foo "bar, тогда в оболочке вам нужно будет сделать что-то вроде "foo \"bar". Использование дополнительных аргументов для system возьмет карту за вас. Использование обратных кавычек не будет, вам нужно создать нужную команду оболочки вручную. - person Quentin; 03.06.2012
comment
$path \$val1 \$val2 \@myarray работает для вызова функции с параметром. но возвращенные значения кажутся не подходящими. Должен ли я записывать возвращаемое значение в функцию выхода, например: exit (value1); ? - person Tyzak; 03.06.2012
comment
@Quentin: Если бы я знал как, я бы исправил свой ответ и перенес его на ваш идентификатор пользователя для репутации. Вы, конечно, правы. В любом случае, я сделаю все, что в моих силах, чтобы исправить свой ответ по вашему совету сейчас. - person thb; 03.06.2012