从PHP调用Perl脚本,并传递变量,同时还采用variablized perl脚本名称从PHP调用

2019-05-12 10:36发布

我通常称之为从PHP Perl脚本如下,并传递变量这种方式,并能正常工作,但现在我建立了再利用的成分,我想也variablize,我路过的Perl脚本的名称,这是让我有些头疼,所以我想知道如果有人能指出一个更好的方式来做到这一点是我的方式是行不通的..谢谢..

如果没有variablized 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();

我试图variablize perl的文件名,它似乎并没有为我工作,你可以在上面看到它是如何,甚至包括在初始“的” $ VAR(S),我觉得奇怪,但是这似乎是唯一的办法,它的作品,我不知道如何即使有variablized 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();

Answer 1:

你的方式是行不通的,因为你是连接所有参数,而空格,有效地使他们的一个参数。

尝试

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

顺便说一句,如果参数是从外部源,则必须使用它们进行消毒escapeshellarg() 这同样适用于$perlscript -如果它来自外部来源,甚至用户输入,做一个escapeshellcmd()在其上。



Answer 2:

在阿里纳斯,有一个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



Answer 3:

在你的第二个代码,你串联变量彼此之间没有空格。 你应该考虑使用sprintf很好地格式化这个:

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


文章来源: Calling Perl script from PHP and passing in variables, while also using variablized perl script name