我继承了OO Perl代码的大型单片体,需要逐步转换为Java(根据客户端请求)。我知道这两种语言,但我的Perl技能生锈了。有没有人可以推荐的工具(Eclipse插件?)来缓解疼痛?
答案 0 :(得分:8)
OO代码是否使用Moose?如果是,则可以使用内省自动转换类声明。
要逐步将Perl转换为Java,您可以使用Inline::Java将Java代码包含到Perl程序中。
有Perl on JVM project,也许它可用于将Perl编译为Java?
答案 1 :(得分:1)
我说PLEAC是最好的资源之一。
答案 2 :(得分:1)
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);
}
Translator现在必须是两个模块的类型,而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);
}
}
翻译后的代码需要执行运行库。