В Perl классической системы модификаторов доступа, как public/private/protected, нет. Всё управление доступом к функциям и данным происходит через соглашения и область видимости переменных.
my (лексическая видимость в пределах файла или блока) и экспорт символов (через Exporter или свои механизмы).@EXPORT, @EXPORT_OK), по умолчанию остаются "внутренними" для модуля, хотя при желании их всегда можно вызвать явным образом с префиксом пакета._internal_sub), что служит соглашением о приватности.Пример:
package MyLib; use Exporter 'import'; our @EXPORT_OK = qw(public_func); my $secret = 123; # Не доступен снаружи sub public_func { _internal_func(); } sub _internal_func { print "This is internal! "; } 1;
Какие меры защищают приватную функцию Perl-модуля от вызова извне кода? Нельзя ли вызвать её напрямую?
Ответ: На самом деле любые подпрограммы пакета можно вызвать явно с полным именем: MyLib::_internal_func(). Perl не ограничивает этот вызов технически — защита только на уровне соглашения.
История
Разработчик экспортировал слишком много функций из модуля, забыв про ограничение через
@EXPORT_OK. В итоге пользователи случайно получали доступ к внутренним функциям, что привело к конфликтам имён и некорректному использованию API.
История
В большом проекте две команды использовали один и тот же внутренний метод (начинающийся с _), думая, что он приватный. Позже поменяли интерфейс функции, что сломало вызовы из другой части системы.
История
В одном из проектов модифицировали модуль внешнего разработчика, напрямую вызывая его неэкспортированные методы. После обновления дистрибутива модуль перестал работать, так как внутренние имена функций изменились, что вызвало падение приложения.