考虑以下脚本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] 删除。
我来说两句