Обычно я вызываю скрипты 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();
Моя попытка изменить имя файла 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();
Ваш способ не работает, потому что вы объединяете все параметры без пробелов, что делает их одним параметром.
Пытаться
$perlscript_file = "/var/www/other_scripts/perl/apps/$perlscript.pl $var1 $var2 $var3 $var4";
Кстати, если параметры поступают из внешнего источника, вы ДОЛЖНЫ их дезинфицировать с помощью escapeshellarg()
. То же самое касается $perlscript
– если он исходит из внешнего источника или даже ввода пользователя, выполните на нем escapeshellcmd()
.
В обозревателе есть пакет 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));
Во втором коде вы объединяете переменные без пробелов между ними. Вы должны рассмотреть возможность использования sprintf
для его форматирования:
$script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4);