从间接包含的模块中命名空间污染

HåkonHægland

考虑以下脚本p.pl

use strict;
use warnings;

use AA;

BB::bfunc();

文件在哪里AA.pm

package AA;

use BB;
1;

文件BB.pm是:

package BB;

sub bfunc {
    print "Running bfunc..\n";
}
1;

运行p.pl给出输出(无警告或错误):

Running bfunc..

问:为什么可以调用BB::bfunc()来自p.pl即使没有use BB;p.pl这不是奇怪的行为吗?还是有可能有用的情况?

(在我看来,这种行为似乎只会向另一个程序包泄漏信息,并且违反了数据隐藏原则。导致程序难以维护。)

清醒

您不会污染名称空间,因为其中的功能BB没有被“导入”到您现有的名称空间中。

它们是独立的,可以独立引用。

如果要制作模块,通常会通过Exporter两个列表进行定义

@EXPORT@EXPORT_OK

前者是打包时应导入的东西的列表use后者是您可以通过以下方式显式导入的内容:

use MyPackage qw ( some_func ); 

您还可以package通过在本地命名空间中定义变量,our通过引用它们$main

 our $fish = "haddock";
 print $main::fish;

执行此操作时,您将显式引用main名称空间。当您use使用模块时,会导致perl您去寻找它,并将其包含在您的中%INC然后,我“知道”该名称空间-因为它必须为了解析依赖关系。

但这不是名称空间污染,因为在您询问之前它不包含任何名称空间。

如果您在同一程序中有多个软件包,这可能会更有意义:

use strict;
use warnings;

package CC;

our $package_var = "Blong";

sub do_something {
   print $package_var,"\n"; 
}

package main;

use Data::Dumper;
our $package_var = "flonk";
print Dumper $package_var;
print Dumper $CC::package_var;

每个package都是它自己的名称空间,但是您可以“戳”另一个。perl还将使您能够使用对象-在实例化对象的内部戳或实际上“修补”它们。

那是非常强大的功能,但我通常会建议使用Really Bad Style。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么是命名空间污染?

来自分类Dev

为什么这个“from bar import *”会使用未在导入模块中定义的名称污染我的命名空间?

来自分类Dev

限制 C++ 头文件中的命名空间污染

来自分类Dev

在Julia中更改REPL模块/命名空间

来自分类Dev

Python中的命名空间和模块

来自分类Dev

是否可以在rake任务中包含一个模块而不会污染全局范围?

来自分类Dev

Javascript 包含命名空间

来自分类Dev

打字稿中的命名空间和模块混乱?

来自分类Dev

使用命名空间模块中的mapStates和mapMutations

来自分类Dev

如何在Vuex中调用多个命名空间模块

来自分类Dev

如何从Vuex中的其他命名空间模块访问rootGetters?

来自分类Dev

如何在命名空间的Cython中包含C ++类?

来自分类Dev

Python中包含tarball和egg的命名空间包

来自分类Dev

异常使用模块命名空间

来自分类Dev

删除模块以清理命名空间?

来自分类Dev

rake命名空间与ruby模块

来自分类Dev

XSLT 包含不同的命名空间

来自分类Dev

命名空间模块auth的重复命名空间auth /

来自分类Dev

在不污染全局命名空间的情况下在另一个 Web 组件中定义一个 Web 组件

来自分类Dev

避免或修复.Net Core中的名称空间污染

来自分类Dev

HBase中的命名空间?

来自分类Dev

lxml中的命名空间

来自分类Dev

.NET中的命名空间

来自分类Dev

XML中的命名空间

来自分类Dev

C ++重新定义变量,全局命名空间被污染,我不知道为什么

来自分类Dev

在F#中,当在命名空间中的模块中时,记录类型可以公开吗?

来自分类Dev

Javascript:Webpack + Typescript +命名空间(内部模块)

来自分类Dev

命名空间模块方法定义

来自分类Dev

使用模块命名空间,可以吗?

Related 相关文章

热门标签

归档