7

I normally call perl scripts from PHP as below and pass in variables this way, and it works fine, however now I am building a component for re-use where I want to also variablize the perl script name that I am passing in and this is giving me some headaches, so I am wondering if anyone can point out a better way to do this as my way isn't working.. thanks..

the way that works without variablized perl filename:

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

My attempt to variablize the perl filename that doesn't seem to be working for me, you can see in the above how it is including even the $var(s) in the initial " ", which I find odd but this seems to be the only way that it works and I wasn't sure how to even replicate this with a variablized perl filename:

$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();
Rick
  • 16,612
  • 34
  • 110
  • 163

3 Answers3

10

Your way is not working because you are concatenating all the parameters without spaces, effectively making them one parameter.

Try

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

By the way, if the parameters are coming from an external source, you MUST sanitize them using escapeshellarg(). The same goes for $perlscript - if it comes from an external source or even user input, do a escapeshellcmd() on it.

Pekka
  • 442,112
  • 142
  • 972
  • 1,088
  • ok thanks, that makes sense.. for now its just internal so its not a big deal about sanitizing them.. thanks for the info – Rick Aug 09 '10 at 09:13
6

On a sidenote, there is a CPAN package that aims to provide a bridge between PHP and Perl, which would allow you to do something like the following in PHP:

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

Not sure how stable this is though. See

If you are using Apache, you can also use

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

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

Gordon
  • 312,688
  • 75
  • 539
  • 559
4

In your second code, you're concatenating the variables without spaces between them. You should consider using sprintf to format this nicely:

$script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4);
reko_t
  • 55,302
  • 10
  • 87
  • 77