• 名字空间有点像你的家,你的家里想怎么乱都行,只要你保持你的外部界面对其他公民说是适度文明的就可以了。
    
    在perl里,一个名字空间叫一个包。
    
    包提供了基本的制作块,在它上面构造更高级的概念,比如模块和类等。
    node2:/root/perl/13#cat pkg01.pm 
    package pkg01;
    $muge="aaa111";
    1;
    node2:/root/perl/13#cat pkg02.pm 
    package pkg02;
    $muge="bbb222";
    1;
    node2:/root/perl/13#cat a1.pl 
    use pkg01;
    use pkg02;
    package pkg01;
    print $muge;
    print "
    ";
    package pkg02;
    print $muge;
    print "
    ";
    node2:/root/perl/13#perl a1.pl 
    aaa111
    bbb222
    
    在OO 的说法中,每个对象都属于一个叫做类的组。
    
    典型的类是用了一个定义了与该类同名的包名字的模块实现的。
    
    
    用my声明的变量独立于包,它们总是属于包围它们的闭合范围,而且也只属于这个范围,不管有什么包声明。
    
    双冒号可以用于把包名字里的标识符连接起来:
    
    $Red::Blue::Var 这就意味着$var属于Red::Blue包。
    
    10.1 符号表:
    
    node2:/root/perl/lib#pwd
    /root/perl/lib
    
    node2:/root/perl/lib#cd Red/Blue/
    node2:/root/perl/lib/Red/Blue#pwd
    /root/perl/lib/Red/Blue
    node2:/root/perl/lib/Red/Blue#ls
    node2:/root/perl/lib/Red/Blue#
    
    
    
    node2:/root/perl/lib/Red/Blue#pwd
    /root/perl/lib/Red/Blue
    node2:/root/perl/lib/Red/Blue#cat pkg01.pm 
    package Red::Blue::pkg01;
    $mg="fsdas313131";
    sub mice {
       my $a=shift;
       my $b=shift;
       return $a + $b;
    };
    1;
    
    
    [root@node01 data01]# cat a1.pl 
    use lib '/root/perl/lib/';
    use  Red::Blue::pkg01;
    print "111111111111111111111111111
    ";
    print $mg;
    print "111111111111111111111111111
    ";
    
    print "222222222222222222222222222
    ";
    print $Red::Blue::pkg01::mg;
    
    [root@node01 data01]# perl a1.pl 
    111111111111111111111111111
    111111111111111111111111111
    222222222222222222222222222
    fsdas313131[root@node01 data01]# 
    
    [root@node01 data01]# cat a2.pl 
    use lib '/root/perl/lib/';
    use  Red::Blue::pkg01;
    foreach $symname (sort keys %Red::Blue::pkg01::) {
    local *sym = $Red::Blue::pkg01::{$symname};
    print "$$symname is defined
    " if defined $sym;
    print "@$symname is nonnull
    " if @sym;
    print "\%$symname is nonnull
    " if %sym;
    }
    [root@node01 data01]# perl a2.pl 
    $mg is defined
    
    
    
    
    10.2 自动装载:
    
    通常,你不能调用一个没有定义的子过程。不过,如果在未定义的子过程的包(
    
    如果是在对象方法的情况下,在任何该对象的基类的包里)有一个子过程叫做AUTOLOAD。
    
    随便调用一个函数,如果这个函数不存在就调用autoload函数  
      
    如果autoload函数你也没实现,那么就返回函数不存在的错误  
      
    名为$AUTOLOAD的变量将被设置为刚才所调用函数的全名("$AUTOLOAD=Mt::ls");  
    
    
    [root@node01 data01]# cat Mt.pm 
    package Mt;  
    our $AUTOLOAD;  
    sub AUTOLOAD {  
      print "$AUTOLOAD=$AUTOLOAD
    ";  
       my $program=$AUTOLOAD;  
      $program=~s/^.*:://g;  
      print "$program=$program
    ";  
      system("$program @_");  
        };  
      1;
    [root@node01 data01]# cat a3.pl 
    use Mt;  
    Mt::ls('-lt');
    [root@node01 data01]# perl a3.pl 
    $AUTOLOAD=Mt::ls
    $program=ls
    total 16
    -rw-r--r-- 1 root root  25 May  4 14:00 a3.pl
    -rw-r--r-- 1 root root 213 May  4 14:00 Mt.pm
    -rw-r--r-- 1 root root 278 May  4 13:49 a2.pl
    -rw-r--r-- 1 root root 209 May  4 13:44 a1.pl
    

  • 相关阅读:
    通道符和xargs命令
    Linux中sudo的用法
    yum中查找程序由哪个包提供
    SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled)
    Centos7中一次性安装开发者工具
    数据库设计步骤
    校验表单demo
    javascript之DOM总结
    javascript之BOM对象总结
    javascript之正则表达式
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349728.html
Copyright © 2020-2023  润新知