曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3743|回复: 0
打印 上一主题 下一主题

“包” 概念及 package 函数

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-10-21 15:33:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
将数据和函数包装到单独的命名空间中称为封装 (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!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 04:57 , Processed in 0.076918 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表