名字空间有点像你的家,你的家里想怎么乱都行,只要你保持你的外部界面对其他公民说是适度文明的就可以了。
在perl里,一个名字空间叫一个包。
包提供了基本的制作块,在它上面构造更高级的概念,比如模块和类等。
node2:/root/perl/13#cat pkg01.pm
package pkg01;
$muge="aaa111";
1;
node2:/root/perl/13#cat pkg02.pm
package pkg02;
$muge="bbb222";
1;
node2:/root/perl/13#cat a1.pl
use pkg01;
use pkg02;
package pkg01;
print $muge;
print "
";
package pkg02;
print $muge;
print "
";
node2:/root/perl/13#perl a1.pl
aaa111
bbb222
在OO 的说法中,每个对象都属于一个叫做类的组。
典型的类是用了一个定义了与该类同名的包名字的模块实现的。
用my声明的变量独立于包,它们总是属于包围它们的闭合范围,而且也只属于这个范围,不管有什么包声明。
双冒号可以用于把包名字里的标识符连接起来:
$Red::Blue::Var 这就意味着$var属于Red::Blue包。
10.1 符号表:
node2:/root/perl/lib#pwd
/root/perl/lib
node2:/root/perl/lib#cd Red/Blue/
node2:/root/perl/lib/Red/Blue#pwd
/root/perl/lib/Red/Blue
node2:/root/perl/lib/Red/Blue#ls
node2:/root/perl/lib/Red/Blue#
node2:/root/perl/lib/Red/Blue#pwd
/root/perl/lib/Red/Blue
node2:/root/perl/lib/Red/Blue#cat pkg01.pm
package Red::Blue::pkg01;
$mg="fsdas313131";
sub mice {
my $a=shift;
my $b=shift;
return $a + $b;
};
1;
[root@node01 data01]# cat a1.pl
use lib '/root/perl/lib/';
use Red::Blue::pkg01;
print "111111111111111111111111111
";
print $mg;
print "111111111111111111111111111
";
print "222222222222222222222222222
";
print $Red::Blue::pkg01::mg;
[root@node01 data01]# perl a1.pl
111111111111111111111111111
111111111111111111111111111
222222222222222222222222222
fsdas313131[root@node01 data01]#
[root@node01 data01]# cat a2.pl
use lib '/root/perl/lib/';
use Red::Blue::pkg01;
foreach $symname (sort keys %Red::Blue::pkg01::) {
local *sym = $Red::Blue::pkg01::{$symname};
print "$$symname is defined
" if defined $sym;
print "@$symname is nonnull
" if @sym;
print "\%$symname is nonnull
" if %sym;
}
[root@node01 data01]# perl a2.pl
$mg is defined
10.2 自动装载:
通常,你不能调用一个没有定义的子过程。不过,如果在未定义的子过程的包(
如果是在对象方法的情况下,在任何该对象的基类的包里)有一个子过程叫做AUTOLOAD。
随便调用一个函数,如果这个函数不存在就调用autoload函数
如果autoload函数你也没实现,那么就返回函数不存在的错误
名为$AUTOLOAD的变量将被设置为刚才所调用函数的全名("$AUTOLOAD=Mt::ls");
[root@node01 data01]# cat Mt.pm
package Mt;
our $AUTOLOAD;
sub AUTOLOAD {
print "$AUTOLOAD=$AUTOLOAD
";
my $program=$AUTOLOAD;
$program=~s/^.*:://g;
print "$program=$program
";
system("$program @_");
};
1;
[root@node01 data01]# cat a3.pl
use Mt;
Mt::ls('-lt');
[root@node01 data01]# perl a3.pl
$AUTOLOAD=Mt::ls
$program=ls
total 16
-rw-r--r-- 1 root root 25 May 4 14:00 a3.pl
-rw-r--r-- 1 root root 213 May 4 14:00 Mt.pm
-rw-r--r-- 1 root root 278 May 4 13:49 a2.pl
-rw-r--r-- 1 root root 209 May 4 13:44 a1.pl