天天看點

名字空間有點像你的家,你的家裡想怎麼亂都行,隻要你保持你的外部界面對其他公民說是适度文明的就可以了。

在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
           
上一篇: 包和導包
下一篇: