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);
}
}
Переведенный код требует выполнения библиотеки времени выполнения.