Могу ли я получить значения из сценария Perl, используя системный вызов из середины другого сценария Perl? - PullRequest
1 голос
/ 20 декабря 2011

Я пытаюсь изменить сценарий, который написал кто-то другой, и я хотел, чтобы мой сценарий отделился от его.

Написанный мною сценарий заканчивается строкой print, которая выводит все соответствующие данные, разделенныепо пробелам.

Пример: print "$sap $stuff $more_stuff";

Я хочу использовать эти данные в середине другого сценария Perl, и я не уверен, возможно ли использовать системный вызов сценария, который я написал.

Пример: system("./sap_calc.pl $id"); #obtain printed data from sap_calc.pl here

Можно ли это сделать?Если нет, как я должен идти об этом?


В некотором роде, но без использования system():

Как мне заставить один скрипт Perl видеть переменные в другом скрипте Perl?

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

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

Вы ищете "оператора обратного хода".

Посмотрите на perlop, раздел "Операторы типа" цитата ".

Как правило,захват результатов программы выглядит следующим образом:

my $output = `/bin/cmd ...`;

Имейте в виду, что оператор backtick захватывает STDOUT only .Таким образом, для захвата всего (также STDERR) команды должны быть добавлены с обычным перенаправлением оболочки "2>&1".

4 голосов
/ 20 декабря 2011

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

system будет возвращать только возвращаемое значение команды оболочки, а не фактический результат.

Хотя правильный способ сделать это - импортировать реальный код в другой скрипт, создав модуль или просто используя do.

Как правило, лучше использовать все Perl-решения, чем полагаться на систему / оболочку как способ "упрощения".

myfile.pl:

sub foo {
    print "Foo";
}
1;

main.pl:

do 'myfile.pl';
foo();
1 голос
/ 20 декабря 2011

perldoc perlipc

Обратные кавычки, как и в shell, приведут к стандартному выводу команды в виде строки (или массива, в зависимости от контекста). Их можно более четко записать в виде оператора qx, подобного кавычкам.

@lines = `./sap_calc.pl $id`;
@lines = qx(./sap_calc.pl $id);
$all = `./sap_calc.pl $id`;
$all = qx(./sap_calc.pl $id);

open также может использоваться для потоковой передачи вместо одновременного чтения в память (как это делает qx). Это также может обойти оболочку, что позволяет избежать всевозможных проблем с цитированием.

open my $fh, '-|', './sap_calc.pl', $id;
while (readline $fh) {
    print "read line: $_";
}
...