2008-11-08 31 views
15

Tôi có một mô-đun Perl mà tôi muốn sử dụng từ Java. Có cách nào để gọi mã này bằng cách sử dụng ActiveState Perl trên Windows hoặc Perl chung đi kèm với Linux không? Tôi đã tìm thấy các tham chiếu đến JPL nhưng nó dường như không còn được duy trì nữa.Tôi có thể gọi Perl từ Java bằng cách nào?

+0

có cần truyền dữ liệu từ perl trở lại java không? đó thường là nơi các vấn đề/khó khăn xảy ra, nếu không, nó sẽ là vấn đề mở một tiến trình và thực thi kịch bản perl. – Chii

Trả lời

17

Inline-Java là thư viện thông thường để gọi java từ Perl và mô-đun post propose a org.perl.java này sẽ cho phép gọi Perl từ Java, như được yêu cầu.

Tuy nhiên, do tính không thể đoán trước của việc triển khai JNI cho các liên kết khác nhau rất khó để nói những kết hợp của JVM và Perl sẽ hoạt động. Thông thường, những gì được yêu cầu là Perl với MULTIPLICITY, và các luồng được biên dịch. Điều đó có nghĩa là anh ta sử dụng một Perl được xây dựng tùy chỉnh.

Nếu không, Inline::Java::Callback cho phép bạn gọi các hàm Perl từ Java. Để làm điều này, bạn cần phải tạo một đối tượng org.perl.inline.java.InlinePerlCaller. Dưới đây là ví dụ về cách sử dụng thông thường:

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

Tôi không biết nó ổn định như thế nào, hoặc duy trì tốt như thế nào, vì vậy, một tùy chọn khác là viết tập lệnh làm ứng dụng của bạn cần và sau đó thực thi tập lệnh đó từ Java. Không phải là cách thanh lịch nhất, nhưng nó hoạt động.

6

Đây không phải là những gì Runtime.exec() là dành cho?

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

Hoặc tôi có hiểu nhầm câu hỏi không?

1

Tôi đã sử dụng Inline :: Java một chút, và thấy nó hơi khó sử dụng, nếu tôi có thời gian, tôi có thể reimplement sử dụng dịch vụ web và gọi mã perl theo cách đó.

0

Tôi tìm thấy một thi trên JavaWorld bởi Robert Lawson, trong đó sử dụng XML-RPC để gọi thói quen Perl từ mã Java của bạn: Call Perl routines from Java

1

Ngủ là một ngôn ngữ kịch bản với một thông dịch chạy trong JVM. Từ những gì tôi hiểu ngôn ngữ Sleep về cơ bản là Perl với một số phần mở rộng. Mã của bạn có thể chạy trong chế độ Ngủ. Nếu có, bạn có thể khởi tạo trình thông dịch, chạy mã và truy xuất kết quả.

+1

Chế độ ngủ không thể chạy bất kỳ mã Perl thú vị nào do tính không tương thích của nó. Bạn không thể thay thế Sleep cho Perl. – daxim

0

Tôi biết điều này là cũ, nhưng gần đây tôi đã gặp các nhu cầu tương tự. Tôi đã tìm thấy JPerl thuận tiện hơn rồi Inline::Java::PerlInterpreter.

0

Đoán nó thực sự phụ thuộc vào những gì mã perl của bạn, và những gì bạn đang cố gắng để làm ..

Nếu chỉ sử dụng exec() là quá đơn giản, một cái gì đó giống như gearman có thể là hữu ích

1

Rakudo cho phép bạn chạy Perl6 bên trong một JVM, và có một Perl5 add-on cho phép bạn chạy mã cũ nhất, mặc dù không có XS của khóa học. Ngoài ra còn có JERL chạy vi điều khiển hiện tại bên trong JVM. Nó phụ thuộc rất nhiều vào những gì bạn đang tìm kiếm để làm, nhưng đó là giá trị kiểm tra ra.

Các vấn đề liên quan