PHP将变量传递给Perl,在变量方法之间使用空格有问题,还有另一种更好的方法吗?

时间:2010-08-16 04:47:12

标签: php regex perl integration

我发现自己需要越来越多地使用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;

2 个答案:

答案 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'" ;