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


    
                                        
    
  • 相关阅读:
    SpringBoot最新教程IDEA版【狂神说Java系列】
    Mybatis最新完整教程IDEA版【通俗易懂2019.11月】
    freemarker 数字格式化(金额格式化)
    idea皮肤插件
    Spring Security 自定义表单登录页
    Spring Security 用户配置
    Spring Security 初体验
    Tomcat 部署 Spring Boot工程
    服务器安装Ngnix
    java读取配置文件
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351089.html
Copyright © 2020-2023  润新知