Вызов сценария Perl из PHP и передача переменных, а также использование изменяемого имени сценария perl

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

способ, который работает без изменяемого имени файла perl:

$file = "/var/www/other_scripts/perl/apps/perlscript.pl $var1 $var2 $var3 $var4";
ob_start();
passthru($file);
$perlreturn = ob_get_contents();
ob_end_clean();

Моя попытка v ariablize имя файла perl, которое, похоже, не работает для меня, вы можете увидеть в приведенном выше, как он включает даже $ var (s) в начальный "", что я считаю странным, но это, похоже, единственный способ что это работает, и я не был уверен, как даже воспроизвести это с измененным именем файла perl:

$perlscript_file = "/var/www/other_scripts/perl/apps/" . $perlscript .".pl";

$file = $perlscript_file . $var1 . $var2  .$var3 . $var4;
ob_start();
passthru($file);
$perlreturn = ob_get_contents();
ob_end_clean();
6
задан Rick 26 August 2012 в 23:28
поделиться

3 ответа

Ваш способ не работает, потому что вы объединяете все параметры без пробелов, фактически делая их одним параметром.

Попробуйте

$perlscript_file = "/var/www/other_scripts/perl/apps/$perlscript.pl $var1 $var2 $var3 $var4";

Кстати, если параметры поступают из внешнего источника, вы ДОЛЖНЫ санировать их с помощью escapeshellarg(). То же самое касается $perlscript - если он приходит из внешнего источника или даже из пользовательского ввода, выполните escapeshellcmd() для него.

9
ответ дан 8 December 2019 в 12:57
поделиться

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

$perl = Perl::getInstance();
$instance = $perl->new('perlclass', @args);

Не уверен, насколько это стабильно. Смотрите

Если вы используете Apache, вы также можете использовать

// PHP
apache_note('foo', 'bar');
virtual("/perl/some_script.pl");
$result = apache_note("resultdata");

# Perl
my $r = Apache->request()->main();
my $foo = $r->notes('foo');
$r->notes('resultdata', somethingWithFoo($foo));

Смотрите http://php.net/manual/en/function.apache-note.php

6
ответ дан 8 December 2019 в 12:57
поделиться

Во втором коде вы объединяете переменные без пробелов между ними. Вам следует подумать об использовании sprintf для удобного форматирования:

$script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4);
3
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: