Mithgol
@Mithgol

Как скрипту на Perl, вызванному из некоторой программы, уместно взаимодействовать с другою (им вызванною) программою (или вообще со скриптом)?

Есть популярная кросс-платформенная программа на языке Си (программа эта — 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 в вышеизложенном примере) наряду с основным значением (которое нетрудно считать со стандартного выхода вызванной программы)? Трудность, трудность! Переменные окружения из дочернего процесса не передаются в родительский, а на ум мне приходят только грязные хаки (например, использование промежуточного файла со случайным именем), которые должны немало тормозить. Или подавать на выход вызываемой программы сериализованный объект?


Жду ваших идей и практических советов. Немало пригодились бы ссылки на блогозаписи и пособия, в которых кто-нибудь решил ужé эту задачку для себя.
  • Вопрос задан
  • 2592 просмотра
Пригласить эксперта
Ответы на вопрос 1
MpaK999
@MpaK999
Буду!
если из С, то я бы посмотрел в сторону perlxs
еще как варианты pipes (IO::Pipe) и например XML::RPC
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы