第十章包: 在 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 "; $str=Dumper($self); print "$str is $str "; return $self; }; $test="fws6f7sfs"; sub setBeanType{ my ($self, $name) = @_;##//传进来的第一个参数是类似c++的self指针,第二个才是真正的参数 $self->{'Bean'} = $name; print "Set bean to $name "; $str=Dumper($self); print "$str is $str "; }; 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 " "; [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 自动装载