第十章包

第十章包:

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


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

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

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

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



[root@wx03 test]# cat p1.pm
package p1;
use base qw(p2);
use Data::Dumper;
sub new {
    my $self = {};
    my $invocant = shift;    
my $class = ref($invocant) || $invocant;
	my ($name)=@_;    
      my $self = {    
         "name" =>$name    
                 };  
    bless $self, $class; # Use class name to bless() reference
    print "111111111111111111\n";
$str=Dumper($self);
print "\$str is $str\n";
    return $self;

};

 $test="fws6f7sfs";
sub setBeanType{
 my ($self, $name) = @_;##//传进来的第一个参数是类似c++的self指针,第二个才是真正的参数
 $self->{'Bean'} = $name;
 print "Set bean to $name \n";
$str=Dumper($self);
print "\$str is $str\n"; 
};


1;


[root@wx03 test]# cat p1.pl
unshift(@INC,"/root/test"); 
require p1;
$ua=p1->new('lily'); 
print $p1::test;



[root@wx03 test]# perl p1.pl
111111111111111111
$str is $VAR1 = bless( {
                 'name' => 'lily'
               }, 'p1' );

fws6f7sfs[root@wx03 test]# 



包里的变量为全局变量,此时p1.pl能够访问到 改为my变量后就无法访问了



[root@wx03 test]# cat t1.pl 
unshift(@INC,"/root/test"); 
require Red::Blue;
print $Red::Blue::var;
print "\n";

[root@wx03 test]# cat Red/Blue.pm 
package Red::Blue;
our $var="31313";
1;

[root@wx03 test]# pwd
/root/test
[root@wx03 test]# perl t1.pl 
31313

访问Red::Blue 模块下的 $var变量

由于这个原因,每个 package 声明都必须声明完整的包名字。任何包名字都没有做任何 隐含的“前缀”的假设,甚
至(看起来象)在一些其他包声明的范围里声明的那样也 如此。


10.1 符号表:


因为包是散列,因此你可以找出该包的键字然后获取所有包中的变量。因此该散列的数值 都是类型团,你可以用好
几种方法解引用。比如:


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

请注意,如果你做这些事
情,那么你将看不到用 my 声明的变量,因为 它们都是独立于包的,不过你看得到用 our 声明的变量。


10.2 自动装载

posted @ 2016-05-17 14:02  czcb  阅读(82)  评论(0编辑  收藏  举报