从PHP调用Perl脚本并传入变量,同时使用变量化的Perl脚本名称

从PHP调用Perl脚本并传入变量,同时使用变量化的Perl脚本名称,php,perl,integration,Php,Perl,Integration,我通常从PHP调用perl脚本,如下所示,并以这种方式传递变量,效果很好,但是现在我正在构建一个可重用的组件,其中我还想对传递的perl脚本名称进行变量化,这让我有些头疼,所以我想知道是否有人能指出一个更好的方法来做这件事,因为我的方法行不通。。谢谢 没有可变perl文件名的工作方式: $file = "/var/www/other_scripts/perl/apps/perlscript.pl $var1 $var2 $var3 $var4"; ob_start(); passthru($fi

我通常从PHP调用perl脚本,如下所示,并以这种方式传递变量,效果很好,但是现在我正在构建一个可重用的组件,其中我还想对传递的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();
$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();
我尝试对perl文件名进行变量化,但这似乎对我不起作用,您可以从上面看到,它是如何将$var(s)包含在首字母“”中的,我觉得这很奇怪,但这似乎是唯一可行的方法,我甚至不确定如何使用变量化的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();
$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
——如果它来自外部源,甚至来自用户输入,请对其进行修改。

在您的第二个代码中,您连接的变量之间没有空格。应该考虑使用<代码> SeaStff来很好地格式化:

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

另一方面,有一个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));

请参见

好的,谢谢,这很有道理。。现在它只是内部的,所以对它们进行消毒没什么大不了的。。谢谢你的信息