首页 > 解决方案 > 为什么即使在 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

解决方案


我们如何才能完全将函数私有化???

你不能。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 strictand use warnings


推荐阅读