|
将数据和函数包装到单独的命名空间中称为封装 (encpasulation)。
包的概念:
单独的命名空间又称为包 (package) 。单独的命名空间意味着,对于命名包中所有的变量,Perl 都持有一个单独的符号表。默认的当前包是 main 包,如你在你的脚本里简单的写一句 print 语句时,该 print 语句就工作在 main 包中。默认情况下,包内所有的变量都是全局变量,而包机制则允许用户切换命名空间,从而让保重的变量称为私有变量,即使它们在包外拥有相同的名称也可如此。
包的作用域:
包的作用域从声明位置开始直到文件末尾,或者是最内层封闭块的末尾,还可以是知道另一个包的声明为止。声明另一个包就用 package 函数。在一个包中引用另一个包中的变量,可以在包名前面加上代表变量数据类型的特殊符号,然后是双冒号和变量名,如:$friend::name 。
示例代码一:
[code=perl]#!/usr/bin/perl
@town = qw(china wencheng qinglan);
$friend = "Jasmine";
#在main包中
print "In main: \$friend is $friend\n";
#声明 boy 包,并切换到其中
package boy;
#$name在main包中的命名空间里,和main中的互不干扰
$name = "Tony";
print "In boy \$name is $name.\n";
#使用main包中的$friend,并进行修改
$main::friend = "Obama";
print "In boy \@town is @::town\n"; #main包是默认包,不需要写出main的名字,用@符号代替main
#切换回main包中
package main;
print "In main: \$name is $name\n";
print "In main: \$main is $boy::name\n";
print "In main: \$friend is $friend.\n";[/mw_shl_code]
运行输出:$ ./package.pl
In main: $friend is Jasmine
In boy $name is Tony.
In boy @town is china wencheng qinglan
In main: $name is
In main: $main is Tony
In main: $friend is Obama.
测试代码二:
[code=perl]#!/usr/bin/perl
#$name 和 $sum 都在 main 包中
$name = "Suzhou";
$sum = 100;
#声明 friend 包并切换至此
package friend;
#在 main 包中声明一个 welcome 的子函数
sub welcome {
print "Who is your pal?";
chomp ($name = <STDIN>); #这里的$name属于friend包
print "Welcome $name!\n";
print "\$num is $num.\n";
print "Where is $main::name?\n\n"; #明确指定使用main包中的$name
}
#切换回 main 包
package main;
&friend::welcome; #需要显式指定才能使用friend包中的welcome函数
print "Back in main package \$name is $name\n";
print "Switch to friend package, Bye", $friend::name, "\n";
print "Bye $name\n\n";
package birthday;
$name = "Tony";
print "Happy Birthday, $name. \n";
print "No, $::name and $friend::name, it is not your birthday!\n";[/mw_shl_code]
运行输出:$ ./package2.pl
Who is your pal?beyes
Welcome beyes!
$num is .
Where is Suzhou?
Back in main package $name is Suzhou
Switch to friend package, Byebeyes
Bye Suzhou
Happy Birthday, Tony.
No, Suzhou and beyes, it is not your birthday! |
|