I believe the standard way is with the Runtime exec() method. I don't know a platform-neutral way to do this, but usually the only thing that changes from system to system is the path to the perl execuatble - so make this user-configurable (like with a properties file) and this isn't too big a deal. For communications you have a number of options - exec() returns a Process, which has getInputStream(), getOutputStream(), and the not-to-be-forgotten getErrorStream() method, which allow communication with the process (your perl script with perceive these as its standard input, standard output, and standard error, respectively. But these are oftern a pain to work with - it's often easier to communicate through files. Put the data you want processed in one file, and have the perl script output its results in another file. Assuming that sort of arrangement makes sense for what you're doing. I assume perl can also communicate through sockets, so that's also an option if you prefer.
Lastly, if you're not too committed to perl already, you might want to look at the Python programming language, which is perhaps perl's biggest rival among interpreted languages. It's much more readable, and there's a Java implementation known as Jython, which is very easy to interface with in a platform-neutral manner. Check out
www.python.org and
www.jython.org. Enjoy...