Есть популярная кросс-платформенная программа на языке Си (программа эта —
HPT, если интересно; но это не существенно), в которую давным-давно всобачили возможность вызова внешних скриптов на языке Perl (
вон в той неофициальной сборке на Google Sites, например).
Типичная процедура на языке Perl получает от этой программы ряд предустановленных переменных и возвращает ряд параметров. Хорошим примером служит фильтр:
sub filter
{
# predefined variables:
# $fromname, $fromaddr, $toname,
# $toaddr (for netmail),
# $area (for echomail),
# $subject, $text, $pktfrom, $date, $attr
# $secure (defined if message from secure link)
# return "" or reason for moving to badArea
# set $kill for kill the message (not move to badarea)
# set $change to update $text, $subject, $fromaddr, $toaddr,
# $fromname, $toname, $attr, $date
return "";
}
Мне стало интересно (и именно об этом мой вопрос), можно ли использовать эту функциональность для того, чтобы использовать перловую функцию как средство вызова другой программы — а далее, возможно, через неё и скрипта на другом языке (скажем, на PHP или на джаваскрипте), если этой другой программою окажется интерпретатор скриптов.
Сразу признаюсь, что сам я не слишком хорошо знаю Перл, не очень-то люблю его и давненько не программировал на нём. Вопрос же обращён к тем, кто знает его достаточно хорошо. В Перле есть масса способов для вызова внешних программ и для передачи данных в них (а затем — приёма данных из них);
IPC::Open2 первым приходит на ум. Не подойдёт ли какой-нибудь из способов для вышеописанной цели? Какие могут быть трудности?
Вроде бы на всех платформах дочерний процесс наследует переменные окружения от родителя, так что переменные из Перла в неперл можно передавать через окружение (хэш
%ENV, или есть что получше?…). Правда, на некоторых платформах накладываются ограничения на размер одной переменной окружения и (или) всего окружения в целом; чтоб не натолкнуться на этот затык, можно наиболее крупное значение (значение переменной
$text) подать на вход вызываемой программы.
Как из вызываемой программы возвратить несколько значений (
$kill и
$change в вышеизложенном примере) наряду с основным значением (которое нетрудно считать со стандартного выхода вызванной программы)? Трудность, трудность! Переменные окружения из дочернего процесса не передаются в родительский, а на ум мне приходят только грязные хаки (например, использование промежуточного файла со случайным именем), которые должны немало тормозить. Или подавать на выход вызываемой программы сериализованный объект?
Жду ваших идей и практических советов. Немало пригодились бы ссылки на блогозаписи и пособия, в которых кто-нибудь решил ужé эту задачку для себя.