我发现自己需要越来越多地使用Perl,因为PHP的正则表达式让我想知道一半的时间是什么,因为它们根本不应该响应(例如,当我使用Perl时)。 ..我一直在使用这种方法来调用perl(在我开始尝试用正则表达式执行此操作之前)..将正则表达式字符串作为变量传递会导致各种问题,例如在任何地方使用“()”都会导致它工作,除其他外..我想知道是否有更好的方法来做这个,而不是perl文件名方法之后的变量字符串,因为它似乎有一些明显的限制..感谢任何信息。
我目前的做法:
$file = "/pathtomy/perlscript.pl $var1 $var2 $var3" ;
ob_start();
passthru($file);
$perlreturn = ob_get_contents();
ob_end_clean();
return $perlreturn;
答案 0 :(得分:2)
对于一般情况,您需要使用escapeshellarg
。盲目地将所有内容包装在单引号中大部分时间都可以工作,但是当你的一个参数包含单引号时会失败!
string escapeshellarg ( string $arg )
escapeshellarg()
在字符串周围添加单引号,并引用/转义任何现有的单引号,允许您将字符串直接传递给shell函数并将其视为单个安全参数。此函数应用于将单个参数转义为来自用户输入的shell函数。 shell函数包括exec()
,system()
和backtick operator。
使用一个打印其命令行参数的简单Perl程序
#! /usr/bin/perl
$" = "]["; # " fix StackOverflow highlighting
print "[@ARGV]\n";
然后从您的问题
中修改PHP程序版本<?php
$var1 = "I'm a";
$var2 = "good boy,";
$var3 = "I am.";
$file = "./prog.pl " . implode(" ",
array_map("escapeshellarg",
array($var1,$var2,$var3)));
echo "command=", $file, "\n";
ob_start();
passthru($file);
$perlreturn = ob_get_contents();
ob_end_clean();
echo "return=", $perlreturn;
?>
我们看到以下输出:
$ php prog.php command=./prog.pl 'I'\''m a' 'good boy,' 'I am.' return=[I'm a][good boy,][I am.]
答案 1 :(得分:0)
尝试使用引号:
$file = "/pathtomy/perlscript.pl '$var1' '$var2' '$var3'" ;