perl - 为什么即使在 EXPORT_FAIL 中指定了子程序,我们也可以访问它?
问题描述
为什么,即使在指定减法函数之后EXPORT_FAIL
,我也能够通过完全定义它来访问该函数mathematics::subtract
?我们如何才能将函数完全私有化?
package mathematics;
use Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(add);
@EXPORT_FAIL = qw(subtract);
sub add() {
print("you can add numbers here"."\n");
}
sub subtract() {
print("you can subtract the numbers here"."\n");
}
1;
解决方案
我们如何才能完全将函数私有化???
你不能。Perl 没有私有或公共的概念。
但是,您可以将其设为词法代码引用并在代码中使用它。
package Foo;
use strict;
use warnings;
my $_private = sub {
return "this is a secret";
}; # note the semicolon
sub bar {
return $_private->(); # call with reference syntax ->()
}
1;
作为一个词法变量,它现在只能从其范围内访问。在这种情况下,该范围是文件,而不是包。因此,如果您在一个文件中有多个包,他们都可以看到它。您不能通过包外部的完全限定名称访问它。
按照惯例,在 Perl 中应该像私有的一样处理的东西用前导下划线命名_
。这就是其他开发人员如何知道某些东西不是模块的公共 API 的一部分,并且它可能会发生变化并且不应该被弄乱。当然,这不会阻止任何人这样做,但通常没有理由阻止他们。
另请注意,Perl 中的包名称通常以驼峰式书写,首字母大写。你的包应该被调用Mathematics
,它应该有use strict
and use warnings
。
推荐阅读
- reactjs - 反应;并行异步/等待获取数据,但在 setState() 中未定义
- function - Dart Functions as First Class Objects
- mysql - 如何使用 sql 查询获取每个 invoice_no 日期的总持续时间(秒)的结果?
- java - 数据流将 {array,int} 馈入 json 对象
- javascript - 前端敏感信息
- swift - 将 EnvronmentObject 传递给 NSHostingControllers
- lua - 是否可以从 C 向 Lua 中的表添加元方法?
- vagrant - 领事开发模式广告标志不起作用
- javascript - 在 React Js 中使用 Helmet 处理动态元数据
- r - 使用单引号和双引号混合创建粘合字符串