View Full Version : Execte Java Program in Perl Script

09-01-2005, 03:43 PM

Can any one provide a soultion for how can we execute a java program in Perl Script. My perl script code goes like this....

#! /perl/bin/perl -wT
print "Content-type: text/html\n\n";

$in = "Hi";
print $in;

exec 'java cgijava '.$in;

'cgijava' is a java program that will take the parameter $in as a command line arguement. I am running this perlscript through the browser. Now my doubt is will the java result be show on the browser? when i run this particular perl script on the browser it shows just my print statement - Hi, and am not getting any output from the java program. The thing is i am not able to make out whether the java program is getting executed or not.

I am using Apache server.


09-01-2005, 04:37 PM
Use backticks or system instead of exec

$javaoutput = `java cgijava $in`;

system "java cgijava $in";

perldoc -f exec
exec LIST
The "exec" function executes a system command *and never
returns*-- use "system" instead of "exec" if you want it to
return. It fails and returns false only if the command does not
exist *and* it is executed directly instead of via your system's
command shell (see below).

Since it's a common mistake to use "exec" instead of "system",
Perl warns you if there is a following statement which isn't
"die", "warn", or "exit" (if "-w" is set - but you always do
that). If you *really* want to follow an "exec" with some other
statement, you can use one of these styles to avoid the warning:

exec ('foo') or print STDERR "couldn't exec foo: $!";
{ exec ('foo') }; print STDERR "couldn't exec foo: $!";

If there is more than one argument in LIST, or if LIST is an
array with more than one value, calls execvp(3) with the
arguments in LIST. If there is only one scalar argument or an
array with one element in it, the argument is checked for shell
metacharacters, and if there are any, the entire argument is
passed to the system's command shell for parsing (this is
"/bin/sh -c" on Unix platforms, but varies on other platforms).
If there are no shell metacharacters in the argument, it is
split into words and passed directly to "execvp", which is more
efficient. Examples:

exec '/bin/echo', 'Your arguments are: ', @ARGV;
exec "sort $outfile | uniq";

If you don't really want to execute the first argument, but want
to lie to the program you are executing about its own name, you
can specify the program you actually want to run as an "indirect
object" (without a comma) in front of the LIST. (This always
forces interpretation of the LIST as a multivalued list, even if
there is only a single scalar in the list.) Example:

$shell = '/bin/csh';
exec $shell '-sh'; # pretend it's a login shell

or, more directly,

exec {'/bin/csh'} '-sh'; # pretend it's a login shell

When the arguments get executed via the system shell, results
will be subject to its quirks and capabilities. See "`STRING`"
in perlop for details.

Using an indirect object with "exec" or "system" is also more
secure. This usage (which also works fine with system()) forces
interpretation of the arguments as a multivalued list, even if
the list had just one argument. That way you're safe from the
shell expanding wildcards or splitting up words with whitespace
in them.

@args = ( "echo surprise" );

exec @args; # subject to shell escapes
# if @args == 1
exec { $args[0] } @args; # safe even with one-arg list

The first version, the one without the indirect object, ran the
*echo* program, passing it "surprise" an argument. The second
version didn't--it tried to run a program literally called
*"echo surprise"*, didn't find it, and set $? to a non-zero
value indicating failure.

Beginning with v5.6.0, Perl will attempt to flush all files
opened for output before the exec, but this may not be supported
on some platforms (see perlport). To be safe, you may need to
set $| ($AUTOFLUSH in English) or call the "autoflush()" method
of "IO::Handle" on any open handles in order to avoid lost

Note that "exec" will not call your "END" blocks, nor will it
call any "DESTROY" methods in your objects.