Как я могу вызвать Perl из Java? - PullRequest
15 голосов
/ 08 ноября 2008

У меня есть модуль Perl, который я хотел бы использовать из Java. Есть ли способ вызвать этот код, используя ActiveState Perl в Windows или общий Perl, который поставляется с Linux? Я нашел ссылки на JPL, но, похоже, он больше не поддерживается.

Ответы [ 9 ]

17 голосов
/ 08 ноября 2008

Inline-Java - это обычная библиотека для вызова java из Perl, и в этом посте предлагается org.perl.java модуль, который должен разрешать вызов Perl с Java, как и просили.

Однако из-за непредсказуемости реализаций JNI для разных JVM трудно сказать, какие комбинации JVM и Perl будут работать. Обычно требуется Perl с MULTIPLICITY и скомпилированные потоки. Это означает, что он использует пользовательский Perl.

В противном случае Inline :: Java :: Callback позволяет вызывать функции Perl из Java. Для этого вам нужно создать объект <strong>org.perl.inline.java.InlinePerlCaller</strong>. Вот пример типичного использования:

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/) ;
} 
6 голосов
/ 08 ноября 2008

Разве это не то, для чего предназначена Runtime.exec ()?

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

Или я неправильно понял вопрос?

1 голос
/ 30 июля 2013

Rakudo позволяет вам запускать Perl6 внутри JVM, и есть дополнение Perl5 , которое позволяет вам запускать самый старый код, хотя, конечно, без XS. Существует также JERL , который запускает текущий microperl внутри JVM. Многое зависит от того, что вы собираетесь делать, но это стоит проверить.

1 голос
/ 07 июня 2010

Sleep - это скриптовый язык с интерпретатором, который работает в JVM. Из того, что я понимаю, язык Sleep - это в основном Perl с некоторыми расширениями. Ваш код может работать в режиме сна. Если это так, вы можете создать экземпляр интерпретатора, запустить код и получить результат.

1 голос
/ 09 ноября 2008

Я немного использовал Inline :: Java и нашел это немного странно, если бы у меня было время, я, вероятно, переопределил бы использование веб-сервисов и вызвал бы код perl таким образом.

0 голосов
/ 26 июля 2011

Думаю, это действительно зависит от того, какой у вас Perl-код и что вы пытаетесь сделать.

Если просто использовать exec () слишком просто, может пригодиться что-то вроде gearman

0 голосов
/ 26 июля 2011

Я знаю, что это старый, но недавно я столкнулся с теми же потребностями. Я нашел JPerl более удобным, чем Inline::Java::PerlInterpreter.

0 голосов
/ 11 ноября 2008

Я нашел реализацию на JavaWorld Роберта Лоусона, которая использует XML-RPC для вызова подпрограмм Perl из вашего кода Java: Вызов подпрограмм Perl из Java

0 голосов
/ 08 ноября 2008

Я не знаю, насколько это будет стабильно или насколько хорошо поддерживается, поэтому другой вариант - написать скрипт, который будет делать то, что понадобится вашему приложению, и затем выполнить этот скрипт из Java. Не самый элегантный способ, но он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...