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

7
我通常使用以下方式从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();
3个回答

10

你的方法不起作用,因为你将所有参数拼接在一起而没有添加空格,实际上这使它们成为一个参数。

尝试:

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

顺便提一下,如果参数来自外部来源,您必须使用escapeshellarg()函数对其进行过滤。对于$perlscript同样如此-如果它来自外部来源或甚至是用户输入,请在其上执行escapeshellcmd()函数。


好的,谢谢,这很有道理。目前只是内部使用,所以清理它们并不是什么大问题。感谢提供信息。 - Rick

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));

请参见http://php.net/manual/zh/function.apache-note.php

4
在您的第二段代码中,您在变量之间没有使用空格进行连接。您应该考虑使用sprintf来使其格式化更好:
$script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接