名字空間有點像你的家,你的家裡想怎麼亂都行,隻要你保持你的外部界面對其他公民說是适度文明的就可以了。
在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 "\n";
package pkg02;
print $muge;
print "\n";
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\n";
print $mg;
print "111111111111111111111111111\n";
print "222222222222222222222222222\n";
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\n" if defined $sym;
print "\@$symname is nonnull\n" if @sym;
print "\%$symname is nonnull\n" 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\n";
my $program=$AUTOLOAD;
$program=~s/^.*:://g;
print "\$program=$program\n";
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