在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的错误使用。
故事
在一个大型项目中,两团队使用相同的内部方法(以_开头),以为它是私有的。后来更改了函数接口,导致系统另一部分的调用中断。
故事
在一个项目中,直接调用外部开发者模块未导出的函数来修改模块。更新发放后,模块停止工作,因为内部函数名发生了变化,导致应用程序崩溃。