Время от времени в интернетах возникает вопрос о том, как спрятать исходники при передаче заказчику проекта на перле. Известно, что эта задача не имеет решения.
Но при работе с внешними заказчиками может возникнуть иная задача: как не передать лишнего.
Задача возникает тогда, когда разным клиентам необходима только часть возможностей вашего приложение. Разбивать исходную программу на несколько независимых в таком случае, скорее всего, будет неоправдано.
Другой пример — требуется предоставить демонстрационную версию программы.
Простое решение, для которого даже не потребуется установки никаких дополнительных утилит, — воспользоваться препроцессором С. Компилятор gcc не в счет: он наверняка уже установлен в системе.
package My::Module;
. . .
#ifdef DEMO_MODE
say rand(10);
#else
say $this->real_method();
#endif
. . .
Еще один пример предложенного подхода — эмуляция встроенной функции say, если потребуется развернуть приложение, в котором из возможностей версии 5.10 используется только say, на сервере со старым перлом:
#ifndef SAY
sub say {
print @_, "\n";
}
#endif
Все, что требуется для того, чтобы на основании таких заготовок получить код для передачи, — запустить препроцессор C:
$ gcc -DDEMO_MODE -E mymodule.pm.c > mymodule.pm
say, кстати, можно попробовать сгенерировать #define-ом.
Вообще сишный препроцессор проще вызывать с помощью cpp.
Спрятать исходники - задача возможная. Filter::Crypto или Module::Crypt.
Подпрограмму для say проще всего включать всегда - say в 5.10 включается только при гыe feature 'say' или use 5.010;