Выполнить Perl-скрипт из C-программы - PullRequest
5 голосов
/ 08 марта 2011

В настоящее время у меня есть программа, написанная на C, и я заинтересован в интеграции в нее довольно длинного сценария perl, написанного кем-то другим, который выполняет аналогичную функцию, но делает это по-другому.Я не заинтересован в переводе всего сценария perl на язык C вручную.

На мой взгляд, есть несколько вариантов:

  1. Поскольку сценарий взаимодействует с использованием stdin и stdЯ знаю, что мог бы использовать системный вызов, например, system("perl script.pl") и направить ввод и вывод, но я чувствую, что это решение не переносимо и не очень элегантно.
  2. Я мог бы встроитьPerl интерпретатор в мою программу для обработки сценария, однако я чувствую, что это, вероятно, будет громоздким и будет излишним для выполнения сценария, который не изменяется.Это дает преимущество, заключающееся в том, что вместо конвейерного ввода и вывода я мог бы вызывать подпрограммы perl напрямую.
  3. Я мог бы использовать какой-нибудь инструмент перевода perl-to-c (например, perlcc) для компиляции источника perlc источником во время компиляции, а затем просто включите его в остальную часть моей программы.Хотя на первый взгляд я подумал, что это будет наилучшим вариантом, в сообществе Perl (или, по крайней мере, в той части, которую мне показала Google), существует широкий консенсус в отношении того, что перевод такого рода не очень хорошая идея (этоможет быть только из соображений скорости, которые для меня не проблема).Это также (возможно?) Позволяет мне вызывать подпрограммы perl из кода C, что было бы огромным плюсом.
  4. Переписать скрипт вручную.

Так что мой вопрос таков: какой из этих вариантов (или ни один из вышеперечисленных) является наиболее элегантным и портативным?Я понимаю, что вызов этой perl-программы из C-программы - это уже грязный взлом, но наименее грязное решение, вероятно, будет лучшим.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

Из решений:

  • Хакерский, но, безусловно, выполнимый. Вы, вероятно, не хотите использовать саму system (), так как вы, вероятно, захотите прочитать и записать вывод, вероятно, из вызовов pipe (). То есть, вам нужно создать необходимые сокеты, разветвиться, а затем выполнить сценарий perl в дочернем элементе и прочитать выходные данные родительского элемента. Хотя это, вероятно, меньше кода, это не обязательно проще, чем:
  • встраивание perl: требуется немного времени для настройки, но как только он настроен, он действительно очень приятный. Я написал целую встроенную Perl-систему для Net-SNMP , которая прекрасно работает. Как только вы его настроите, это удивительно, как мало усилий требуется для его запуска и запуска. Это, как говорится, довольно страшный код.
  • perl-to-c может быть хорошим в теории, но я бы не ожидал, что он будет работать постоянно. Если вам нужно сделать это только один раз, возможно, стоит попробовать. Но вам понадобится хороший набор для тестирования, чтобы убедиться, что результат соответствует вашим ожиданиям.
  • переписывание сценария вручную: честно говоря, это, безусловно, самое «чистое» решение. Если сценарий не изменится в будущем, скорее всего, так и будет, если только это не сложная задача, потому что на самом деле она такая большая (не говорите).

Каждый из перечисленных методов имеет свои преимущества и недостатки. Это зависит от того, что вас беспокоит:

  • Делая это часто (т. Е. Perl будет постоянно меняться): используйте встроенный perl
  • наименьшее количество времени: тогда это зависит от того, насколько велик сценарий. 1, 2, 3 или 4, вероятно, будут самыми быстрыми в зависимости от того, как выглядит скрипт. Если это долго, то пропустите # 4. Если это действительно коротко, тогда идите прямо к номеру 4.

В конце концов, если бы это был я, я бы выбрал встраивание или перевод в зависимости от того, изменится ли он снова.

Теперь ... я написал целую систему для геокэшинга , которую я на самом деле хочу перевести в Qt , потому что я думаю, что она будет более переносимой. Какой мой правильный выбор? Идет перевод. Но это займет много времени, поэтому я еще этого не сделал.

0 голосов
/ 08 марта 2011

Если скрипт perl не очень длинный, возможно, вам следует переписать его на C и забыть о perl.

В противном случае, я бы использовал системный вызов.Если вас беспокоит переносимость, вы можете скомпилировать скрипт perl с помощью perlcc, чтобы получить исполняемый файл, который будет полностью переносимым и избавит вас от установки perl на каждом компьютере, на котором вы хотите запустить эту программу.

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