Как я могу конвертировать OO Perl в Java? - PullRequest
3 голосов
/ 10 июля 2009

Я унаследовал большое монолитное тело кода OO Perl, которое необходимо постепенно преобразовывать в Java (по запросу клиента). Я знаю оба языка, но не знаю, как работать с Perl. Есть ли какие-нибудь инструменты (плагины Eclipse?), Которые вы, ребята, можете порекомендовать, чтобы облегчить боль?

Ответы [ 3 ]

8 голосов
/ 10 июля 2009

Использует ли OO-код Moose? Если да, то можно автоматически конвертировать объявления классов с помощью самоанализа.

Чтобы постепенно преобразовать Perl в Java, вы можете включить код Java в программу Perl с помощью Inline :: Java .

В проекте JVM есть Perl , может быть, его можно использовать для компиляции Perl в Java?

1 голос
/ 24 марта 2013

inccode.com позволяет автоматически преобразовывать код perl в код java. Тем не менее, преобразование переменных perl немного сложнее из-за динамической типизации perl. Скалярная переменная в perl может содержать ссылку на любой тип, а реальный ссылочный тип известен при выполнении кода.

Translator использует класс VarBox для инкапсуляции всех предопределенных типов: ref (HASH), ref (ARRAY) и BoxModule для инкапсуляции ссылки на модули Perl.

В примере показан скрипт perl, который вызывает два модуля для вывода «hello world». Модуль LibConsole создается в сценарии, а доступ к модулю LibPrinter осуществляется путем вызова метода в LibConsole.

    #!/usr/bin/perl
use strict;

use test::LibPrinter;
use test::LibConsole;

hello_on_console( "hello world");
hello_on_printer( "hello world");

    sub get_console
{
    my $console = test::LibConsole->new();  
    return $console;        
}

sub get_printer
{
#@cast(module="test::LibPrinter")   
    my $printer = get_console()->get_printer(); 
    return $printer;        
}    

sub hello_on_console
{
    my ($hello) = @_;

    my $console = get_console();
    $console->output ($hello);  
}

sub hello_on_printer
{
    my ($hello) = @_;
    my $printer= get_printer();
    $printer->output ($hello);  
}

Переводчик должен теперь типы обоих модулей, и хотя perl не определяет конкретные операторы для объявления объекта, существует предположение, что метод с именем «new» возвращает ссылку на модуль. Когда метод, который возвращает ссылку на модуль, называется иначе, приведение аннотации (module = ”{class}”) может использоваться для информирования переводчика о типе модуля.

Идентифицированный тип переменной будет распространен, потому что переводчик контролирует соответствие типов в назначениях.

     public class hello extends CRoutineProcess implements IInProcess
 {
   VarBox call ()
   {
      hello_on_console("hello world");
      return hello_on_printer("hello world");

   }
   BoxModule<LibConsole> get_console ()
   {
      BoxModule<LibConsole> varConsole = new BoxModule<LibConsole>(LibConsole.apply());
      return varConsole;
   }
   BoxModule<test.LibPrinter> get_printer ()
   {  
      BoxModule<LibPrinter> varPrinter = new BoxModule<LibPrinter>(get_console().getModule().get_printer());
      return varPrinter;
   }
   VarBox hello_on_console (VarBox varHello)
   {
      BoxModule<LibConsole> varConsole = new BoxModule<LibConsole>(get_console());
      return varConsole.getModule().output(varHello);
   }
   VarBox hello_on_printer (VarBox varHello)
   { 
      BoxModule<LibPrinter> varPrinter = new BoxModule<LibPrinter>(get_printer());
      return varPrinter.getModule().output(varHello);
   }

 }

Переведенный код требует выполнения библиотеки времени выполнения.

1 голос
/ 10 июля 2009

Я бы сказал, PLEAC - один из величайших ресурсов.

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