<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 自动装载: