如何从Java调用Perl?

如何从Java调用Perl?,java,perl,Java,Perl,我有一个Perl模块,我想从Java中使用它。有没有办法在Windows上使用ActiveState Perl或Linux附带的通用Perl调用此代码?我找到了对JPL的引用,但它似乎不再被维护。是从Perl调用java的常用库,这个模块应该允许根据要求从java调用Perl 然而,由于JNI实现对不同应用程序的不可预测性 JVM很难说JVM和Perl的哪些组合会起作用。通常,需要的是具有多重性的Perl,以及在中编译的线程。这意味着他使用定制的Perl 否则,允许您从Java调用Perl函数。

我有一个Perl模块,我想从Java中使用它。有没有办法在Windows上使用ActiveState Perl或Linux附带的通用Perl调用此代码?我找到了对JPL的引用,但它似乎不再被维护。

是从Perl调用java的常用库,这个模块应该允许根据要求从java调用Perl

然而,由于JNI实现对不同应用程序的不可预测性 JVM很难说JVM和Perl的哪些组合会起作用。通常,需要的是具有多重性的Perl,以及在中编译的线程。这意味着他使用定制的Perl

否则,允许您从Java调用Perl函数。为此,您需要创建一个
org.perl.inline.java.InlinePerlCaller
对象。以下是一个典型使用示例:

use Inline Java => <<END ;
import java.util.* ;
import org.perl.inline.java.* ;

class Pod_regexp extends InlineJavaPerlCaller {
    public Pod_regexp() throws InlineJavaException {
    }

    public boolean match(String target, String pattern)
        throws InlineJavaException {
        try {
            String m = (String)CallPerlSub("main::regexp",
            new Object [] {target, pattern}) ;

            if (m.equals("1")){
            return true ;
        }
    }
    catch (InlineJavaPerlException pe){
        // $@ is in pe.GetObject()
    }

    return false ;
    }
}
END

my $re = new Pod_regexp() ;
my $match = $re->match("Inline::Java", "^Inline") ;
print($match . "n") ; # prints 1

sub regexp {
    my $target = shift ;
    my $pattern = shift ;

    return ($target =~ /$pattern/) ;
} 

使用内联Java=>我不知道它有多稳定,或者维护得有多好,所以,另一个选择是编写一个脚本,完成应用程序需要的任务,然后从Java执行该脚本。这不是最优雅的方式,但它可以工作。

这不是Runtime.exec()的用途吗


还是我误解了这个问题?

我使用了一些内联::Java,发现它有点复杂,如果我有时间的话,我可能会使用web服务重新实现,并以这种方式调用perl代码。

我找到了Robert Lawson在JavaWorld上的一个实现,它使用XML-RPC从Java代码中调用Perl例程:

Sleep是一种脚本语言,带有在JVM中运行的解释器。据我所知,睡眠语言基本上是带有一些扩展的Perl。您的代码可能可以在睡眠中运行。如果有,您可以实例化解释器,运行代码并检索结果。

我知道这很旧,但我最近遇到了同样的需求。我发现内联::Java::PerlInterpreter比内联::Java::PerlInterpreter更方便

我想这真的取决于你的perl代码是什么,以及你想做什么


如果仅仅使用exec()太简单,那么类似的东西可能会很有帮助

允许您在JVM中运行Perl6,并且有一个允许您运行大多数旧代码的方法,当然没有XS。还有一种方法在JVM中运行当前的microperl。这在很大程度上取决于您想要做什么,但这些都值得一看。

是否需要将数据从perl传递回java?这通常是出现问题/困难的地方,否则,就需要打开一个进程并执行perl脚本。由于不兼容,Sleep无法运行任何有趣的perl代码。不能用睡眠代替Perl。
Runtime.getRuntime().exec("/usr/bin/perl myPerl.pl");