Вызов 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(); 

Моя попытка изменить имя файла 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); 

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

  • PHP :: Переводчик
  • Интеграция PHP и Perl

Если вы используете 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

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

 $script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4);