我通常从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();
我尝试变量似乎对我不起作用的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();
答案 0 :(得分:9)
你的方式不起作用,因为你连接所有参数没有空格,有效地使它们成为一个参数。
尝试
$perlscript_file = "/var/www/other_scripts/perl/apps/$perlscript.pl $var1 $var2 $var3 $var4";
顺便说一下,如果参数来自外部来源,你必须使用escapeshellarg()
消毒它们。 $perlscript
也是如此 - 如果它来自外部来源甚至是用户输入,请在其上执行escapeshellcmd()
。
答案 1 :(得分:6)
在旁注中,有一个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));
答案 2 :(得分:3)
在第二个代码中,您将连接变量,它们之间没有空格。你应该考虑使用sprintf
来很好地格式化:
$script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4);