5、指定無當前包 在Perl 5中,可以用如下語句指定無當前包: package; 這時,所有的變量必須明確指出所屬包名,否則就無效--錯誤。 $mypack::var = 21; #ok $var = 21; #error - no current package 這種情況直到用package語句指定當前包為止。 6、包和子程序 包的定義影響到程序中的所有語句,包括子程序,如:
package mypack; subroutine mysub { local ($myvar); # stuff goes here } 這里,mysub和myvar都是包mypack的一部分。在包mypack外調用子程序mysub,則要指定包:$mypack'mysub。 可以在子程序中切換包:
package pack1; subroutine mysub { $var1 = 1; package pack2; $var1 = 2; } 這段代碼創建了兩個變量$var1,一個在包pack1中,一個在包pack2中,包中的局域變量只能在其定義的子程序等語句塊中使用,像普通的局域變量一樣。 7、用包定義私有數據 包最通常的用途是用在含有子程序和子程序所使用的全局變量的文件中,為子程序定義這樣的包,可以保證子程序使用的全局變量不可在其它地方使用,這樣的數據即為私有數據。更進一步,可以保證包名不可在其它地方使用。私有數據例:
1 : package privpack; 2 : $valtoprint = 46; 3 : 4 : package main; 5 : # This function is the link to the outside world. 6 : sub printval { 7 : &privpack'printval(); 8 : } 9 : 10: package privpack; 11: sub printval { 12: print ("$valtoprint\n"); 13: } 14: 15: package main; 16: 1; # return value for require 此子程序只有在調用printval后才能產生輸出。 該文件分為兩個部分:與外界聯系的部分和私有部分。前者為缺省的main包,后者為包privpack。第6~8行定義的子程序printval可被其它程序或子程序調用。printval輸出變量$valtoprint的值,此變量僅在包privpack中定義和使用。第15、16行確保其被其它程序用require語句包含后工作正常,15行將當前包設置回缺省包main,16行返回非零值使require不報錯。
8、包和系統變量 下列變量即使從其它包中調用,也在main包中起作用:
·文件變量STDIN, STDOUT, STDERR 和 ARGV ·變量%ENV, %INC, @INC, $ARGV 和 @ARGV ·其它含有特殊字符的系統變量 9、訪問符號表 在程序中查找符號表可用數組%_package,此處package為想訪問的符號表所屬的包名。例如%_main含有缺省的符號表。 通常不需要親自查找符號表。
|