天天看點

第10章 包 名字空間,變量和函數

名字空間,變量和函數就不會把别人的變量和函數搞砸了,反之亦然,名字空間有點像你的家,你的家裡想怎麼亂都行,

隻要你保持你的外部界面對其他公民來說是适度文明就可以了。

在Perl裡,一個名字空間叫一個包,包提供了基本的制作塊,在它上面構造更進階的概念,比如子產品和類等。

在OO的說法中,每個對象都屬于一個叫做類的組。在Perl裡,類和包以及子產品之間的關系是如此密切,

以至于需要新手經常認為它們是客戶呼喚的,典型的類是用一個定義了與該類同名的包名字的子產品實作的。

Perl裡的面向對象的程式設計是通過引用來實作的,這些引用的引用物知道它們屬于哪些類。

10.1 符号表

一個包的内容總體在一起稱作符号表,符号表都存儲在一個散列裡,這個散列的名字和該包的名字相同,

但是後面附加了兩個冒号。是以main符号表的名字是%main::.

因為碰巧也是預設的包,Perl 把%::當做%main::的縮寫。

因為包是散列,是以你可以找出該包的鍵字然後擷取所有包中的變量。是以該散列的數值都

是類型團,你可以用好幾種方法解引用。比如:

foreach symname(sortkeyslocal∗sym=main::{symname};  

print “\$symname is defined\n" if defined $sym; ##解引用标量

print “\@$symname is nonnull\n” if @sym; ##解引用數組

print “\%$symname is nonnull\n” if %sym; ##解引用hash

}

在Perl裡,一個名字空間叫一個包。

在面向對象裡,每個對象都屬于一個叫做類的組。

Perl裡面向對象的程式設計是通過引用來實作的,

一個獨立命名空間中的變量就是對象的資料 函數就是對象的方法,

是以perl裡隻需要包package的觀念就可以實作 OO了 不需要特别的類Class,

你把一個package隔離的命名空間叫做“類”也可以 效果類似

所謂的類 對象 隻是你在單獨命名空間中操作的變量和函數 這樣應該好了解, 不要再去想其他語言的Class之類的東西 perl沒

朝着生态程式設計的第一步是: 不要在公園裡亂丢垃圾,

當你寫一段代碼時,考慮一下給這些代碼自己的名字空間,這樣你的變量和函數就不會把别人的變量和函數搞砸了,

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

在perl裡,一個名字空間叫做一個包。包提供了基本的制作塊,在他上面構造更進階的概念,比如子產品和類等。

典型的類是用一個定了與該類同名的包名字的子產品實作的

main包内容;

[oracle@jhoa 2]cata2.plforeachkey (keys %main::)

{print “$key=>main::{$key}\n”;}

[oracle@jhoa 2]perla2.pl/ => *main::/

stderr=>∗main::stderrkey => *main::key

utf8::=>∗main::utf8::” => *main::”

$CORE:: => *main::CORE::

一個包的内容總體在一起稱做符号表,符号表都存儲在一個散列裡,這個散列的名字和該包名字相同,

單手後面附加了兩個冒号。是以main符号表的名字是%main::. 因為main碰巧也是預設的包,

perl 把%::, 當作%main::的縮寫:

[root@master Webqq]# cat t26.pl

foreach key (keys %::)  

 {print “\$$key =>   $main::{$key}\n”;}  

[root@master Webqq]# perl t26.plversion:: => *main::version::

/=>∗main::/stderr => *main::stderr

$_