2008-11-08 130 views
15

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

+0

是否需要将数据从perl传递回java?那通常是出现问题/困难的地方,否则,这将是打开一个进程并执行perl脚本的问题。 – Chii 2008-11-08 16:31:12

回答

17

Inline-Java是从Perl调用java的常用库,以及这个应该允许从Java调用Perl的post propose a org.perl.java模块。

但是,由于不同 JVM的JNI实现的不可预测性,很难说JVM和Perl的组合会起作用。通常,需要的是具有MULTIPLICITY的Perl和编译的线程。这意味着他使用定制的Perl。

否则,Inline::Java::Callback允许您从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){ 
     // [email protected] 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/) ; 
} 
-1

我不知道如何稳定这是否或者如何保持良好事实就是这样,另一种选择是编写一个脚本,做一些事情你会申请需要然后从Java执行该脚本。不是最优雅的方式,但它的工作原理。

6

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

Runtime.getRuntime().exec("/usr/bin/perl myPerl.pl"); 

还是我误解了这个问题?

1

我已经使用了Inline :: Java,并且发现它有点复杂,如果我有时间结束,我可能会重新实现使用Web服务并以这种方式调用perl代码。

1

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

+1

睡眠不能运行任何有趣的Perl代码,因为它的不兼容性。你不能用Sleep代替Perl。 – daxim 2010-06-09 09:39:40

0

我知道这是旧的,但我最近遇到了相同的需求。我发现JPerl更方便Inline::Java::PerlInterpreter

0

猜猜这真的取决于你的Perl代码是什么,你想如果只是使用EXEC()做..

什么太简单,像gearman可帮助

1

Rakudo允许您在JVM中运行Perl6,并且有一个允许您运行大多数旧代码的Perl5 add-on,尽管当然没有XS。在JVM内部还有运行当前microperl的JERL。这取决于你想要做什么,但这些值得检查。