Как я могу вызвать Perl из Java?

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

есть ли необходимость передавать данные из perl обратно в java? обычно здесь возникают проблемы / трудности, иначе это будет вопрос открытия процесса и выполнения сценария perl.

Chii 08.11.2008 19:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
16
1
29 251
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

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

Однако из-за непредсказуемости реализаций JNI для разных JVM трудно сказать, какие комбинации JVM и Perl будут работать. Обычно требуется Perl с МНОЖЕСТВЕННОСТЬЮ и скомпилированные потоки. Это означает, что он использует специально созданный Perl.

В противном случае Встроенный :: Java :: Обратный вызов позволяет вам вызывать функции Perl из Java. Для этого вам необходимо создать объект 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. Не самый элегантный способ, но он работает.

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

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

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

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

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

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

Sleep не может запускать какой-либо интересный код Perl из-за его несовместимости. Вы не можете заменить Perl на Sleep.

daxim 09.06.2010 13:39

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

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

Если просто использовать exec () слишком просто, может быть полезно что-то вроде редуктор

Ракудо позволяет вам запускать Perl6 внутри JVM, и есть Надстройка Perl5, который позволяет запускать большую часть старого кода, хотя, конечно, не XS. Также существует JERL, который запускает текущий microperl внутри JVM. Это во многом зависит от того, чем вы хотите заниматься, но это стоит проверить.

Другие вопросы по теме