您的位置:首页 > 其它

第十章包

2016-05-17 14:02 288 查看
第十章包:

在 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 自动装载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: