2010-08-09 13 views
6

J'appelle normalement les scripts Perl de PHP comme ci-dessous et je passe des variables de cette façon, et ça marche bien, mais maintenant je construis un composant pour re -utiliser où je veux aussi variabliser le nom du script Perl que je passe et cela me donne des maux de tête, alors je me demande si quelqu'un peut indiquer une meilleure façon de le faire comme mon chemin ne fonctionne pas .. merci ..Appeler un script Perl depuis PHP et passer des variables, tout en utilisant le nom de script Perl Variablized

la façon dont fonctionne sans variablized perl nom de fichier:

$file = "/var/www/other_scripts/perl/apps/perlscript.pl $var1 $var2 $var3 $var4"; 
ob_start(); 
passthru($file); 
$perlreturn = ob_get_contents(); 
ob_end_clean(); 

Ma tentative de variablize le nom du fichier perl qui doe sn't semble travailler pour moi, vous pouvez voir dans le dessus comment il est même compris le $ var (s) dans le "" initial, que je trouve étrange mais cela semble être la seule façon que cela fonctionne et je n'était pas sûr de savoir comment reproduire même cela avec un nom de fichier perl variablized:

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

Répondre

9

Votre ne fonctionne pas parce que vous concaténez tous les paramètres sans espaces, ce qui les rend effectivement un paramètre.

Essayez

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

Par ailleurs, si les paramètres proviennent d'une source externe, vous MUST désinfecte les utiliser escapeshellarg(). La même chose vaut pour $perlscript - si elle provient d'une source externe ou même d'une entrée utilisateur, faites-y escapeshellcmd().

+0

ok merci, cela fait sens pour l'instant .. c'est juste interne donc ce n'est pas une grosse affaire de les assainir .. merci pour le i nfo – Rick

3

Dans votre second code, vous concaténéz les variables sans espace entre elles. Vous devriez envisager d'utiliser sprintf pour formater ce bien:

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

Sur sidenote, il y a un paquet CPAN qui vise à jeter un pont entre PHP et Perl, qui vous permettra de faire quelque chose comme ce qui suit en PHP:

$perl = Perl::getInstance(); 
$instance = $perl->new('perlclass', @args); 

Vous ne savez pas à quel point c'est stable. Voir

Si vous utilisez Apache, vous pouvez également utiliser

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

Voir http://php.net/manual/en/function.apache-note.php