第10章 包

<pre name="code" class="python">在Perl里,一个名字空间叫一个包,包提供了基本的制作块,在它上面构造更高级的概念,比如模块和类等。


在OO里,每个对象都属于一个叫做类的组。


典型的类是用一个定义了与该类同名的包名字的模块实现的。


在Perl里的面向对象的编程是通过引用来实现的, 这些引用的引用物知道它们属于哪些类。


最初的当前包叫做"main",不过你可以用package 声明在任何时候把当前的包切换成另外一个,


当前包决定使用哪个符号表查找你的变量,子过程,I/O句柄和格式等。

双冒号可以用于把包名字里的标识符链接起来:$Red::Blue::Var。

这就意味着 $var 属于 Red::Blue 包。

10.1 符号表:

一个包的内容总体在一起称做符号表,符号表都存储在一个散列里,这个散列的名字和该包的名字相同,


但是后面附加了两个冒号。


因此main符号表的名字是%main::,因为main技巧也是缺省的包,Perl把%:: 当作%main::的缩写





-----------------------------------------------------------------------

---------------------------------------------------------

在OO的说法中,每个对象都属于一个叫做类的组。

最初的当前包叫做“main”,
不过你可以用 package 声明在任何时候把当前的包切换成另外一个。当前包决定使用哪
个符号表查找你的变量,子过程,I/O 句柄和格式等。

main包内容:
zjzc01:/root/big3# cat 1.pl 

foreach $key (keys %main::)  
{print "$$key => $main::{$key}
";} 
zjzc01:/root/big3# perl 1.pl 
$version:: => *main::version::
$/ => *main::/
$stderr => *main::stderr
$_<mro.c => *main::_<mro.c
$key => *main::key
$Tie:: => *main::Tie::
$utf8:: => *main::utf8::
$" => *main::"
$re:: => *main::re::
$CORE:: => *main::CORE::
$DynaLoader:: => *main::DynaLoader::
$mro:: => *main::mro::
$stdout => *main::stdout
$attributes:: => *main::attributes::
$ => *main::
$stdin => *main::stdin
$ARGV => *main::ARGV
$INC => *main::INC
$ENV => *main::ENV
$Regexp:: => *main::Regexp::
$UNIVERSAL:: => *main::UNIVERSAL::
$$ => *main::$
$_<perlio.c => *main::_<perlio.c
$main:: => *main::main::
$_<perlmain.c => *main::_<perlmain.c
$PerlIO:: => *main::PerlIO::
$0 => *main::0
$_<universal.c => *main::_<universal.c
$BEGIN => *main::BEGIN
 => *main::
$@ => *main::@
$_<xsutils.c => *main::_<xsutils.c
$STDOUT => *main::STDOUT
$IO:: => *main::IO::
$ => *main::
$_ => *main::_
$STDERR => *main::STDERR
$Internals:: => *main::Internals::
$STDIN => *main::STDIN
$DB:: => *main::DB::


通常,一个package声明如果是一个文件的第一个语句的话就意味着它将被require或者use包含。

但这只是习惯,你可以在任何可以放一个语句的地方放一个package声明。


你可以在多于一个的地方切换到一个包里面


双冒号可以用于把包名字里的标识符链接起来:$Red::Blue::Var。这就意味着 $var 属
于 Red::Blue 包



由于这个原因,每个package声明都必须声明完整的包名字。任何包名字都没有做任何隐含的"前缀"假设


10.1 符号表:


一个包的内容总体在一起称做符号表,符号表都存储在一个散列里, 包的内存是散列

zjzc01:/root/big3# cat 3.pl 
unshift(@INC,"/root/pfwx-master/pfwx-master/lib");  
require Weixin::Message;
#package Weixin::Message;
foreach $key (keys %Weixin::Message::)  
{print "$$key => $main::{$key}
";} 

zjzc01:/root/big3# perl 3.pl 
$__ANON__ => 
$MM_VERIFYUSER_SENDREQUEST => 
$STATE_READ => 
$MM_APPMSG_VOICEREMIND_CONFIRM => 
$encode => 
$MM_DATA_EMOJI => 
$APPMSGTYPE_TEXT => 
$StatusNotifyCode_QUIT_SESSION => 
$_parse_synccheck_data => 
$_parse_send_status_data => 
$MM_DATA_APP_MSG_ATTACH_TYPE => 
$MM_BIZ_DATA_VOICE => 
$MM_CONTACTFLAG_3RDAPPCONTACT => 
$MM_DATA_PRIVATEMSG_IMG => 
$MM_DATA_VIDEO_IPHONE_EXPORT => 
$MM_MEMBER_NOUSER => 
$MM_USERATTRVERIFYFALG_BIZ_VERIFIED => 
$MM_CONTACTFLAG_NOTIFYCLOSECONTACT => 
$_mod_chatroom_member => 
$MM_MEMBER_USERNAMEINVALI


这个散列的名字和该包的名字相同,大师后面附加了两个冒号。


因此main符号表的名字就是%main::  

类似,Red::Blue 包的符号表名字是%Red::Blue::



同时main符号表还包含所有其他顶层的符号表,包括它本身。因此%Red::Blue:: 同时也是%main::Red::Blue::


这也是Exporter在从一个包向另外一个包输出符号的时候采用的方法。比如:

10.2 自动装载:


















                                    
原文地址:https://www.cnblogs.com/hzcya1995/p/13351089.html