Chinaunix首页 | 论坛 | 博客
  • 博客访问: 966281
  • 博文数量: 184
  • 博客积分: 10030
  • 博客等级: 上将
  • 技术积分: 1532
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-27 18:32
文章分类

全部博文(184)

文章存档

2009年(1)

2008年(63)

2007年(39)

2006年(79)

2005年(2)

我的朋友

分类:

2006-12-25 17:21:39

Perl利用“包”(Package)或“名字空间”(Namespace)来决定变量和子程序标识符的可访问性。也可用包来访问在其他名为“模块”的文件中定义标识符。Perl的大多数作用域规则都是自“包”的概念衍生出来的。
 
每个包都有自己的“符号表”,其中包含了这个包中的所有变量及子程序的名字。在默认情况下。Perl源码文件中的全局标识符(全局变量和子程序)属于main包的符号表的一部分。事实上,Perl根本没有真正的“全局”变量。像这样的变量实际应该叫做“包全局变量”或“包变量”。
 
字典变量的特殊之处在于,它们不会插入包的符号表中。相反,每个定义了字典变量的代码块都有它自己的一个临时存储区域,专门用来保存字典变量。我们把这个存储区域叫“草稿区”。
 
对于一个包来说,它的符号 表其实就是一个散列--标识符作为“键”,而内存位置作为“值”。大家知道,在散列中,所有键都必须是独一无二的。同样,相同类型的变量的名字也必须使没有重复的。举个例子,在一个包里不能同时出现两个名为$var的标量。不过,一个包里可同时包括一个名为$var的标量和一个名为@var的一个数组。
 
6.14.1 用require定义并导入一个包
迄今为止,我们都在同程序的默认包打交道,这便是main包。假如我们不明确指定一个,那么main便是当前包的名字,也是它的名字空间。假如在这个文件里创建标识符,它会自动成为main包的一部分。然而,我们可用package语句对当前包进行修改。假如创建了一个新包,会促使Perl创建一个新的、空的符号表。在每个源码文件中,通常只有一个package语句。假如程序里同时包含了两个或更多的包,那么每个包都会维持自己的那一套唯一的标识符。换言之,不同的包完全可以采用完全相同的标识符,不会产生名字之间的冲突。
下面是例子:
#!usr/bin/perl
#Fig 6.17: fig06_17.pl
# Demonstrating packages.
# make FirstPackage.pm available to this program
require FirstPackage;
# define a package global variable in this program
our $variable = "happy";
# display values from the main package
print "From main package:\n";
print "\$variable = $variable\n";
print "\$main::variable = $main::variable\n";
# display values from FirstPackage
print "\nFrom FirstPackage:\n";
print "\$FirstPackage::variable = $FirstPackage::variable\n";
print "\$FirstPackage::secret = $FirstPackage::secret\n";
# use a subroutine in FirstPackage to display the
# values of the variables in that package
FirstPackage::displayFirstPackageVariables();
 
------------------------------------------------------------------
#! /usr/bin/perl
# Fig 6.18: FirstPackage.pm
# Our first package.
package FirstPackage;   # name the pacakge/namespace
# define a package global variable
our $variable = "birthday";
# define a variable known only to this package
my $secret = "new year";
# subroutine that displays the values of
# the variables in FirstPackage
sub displayFirstPackageVariables
{
   print "\$variable in displayFirstPackageVariables = ",
         $variable, "\n";
   print "\$secret in displayFirstPackageVariables = ",
         $secret, "\n";
}
-----------------------------------------------------------------------
程序输出如下:
From main package:
$variable = happy
$main::variable = happy
From FirstPackage:
$FirstPackage::variable = birthday
$FirstPackage::secret =
$variable in displayFirstPackageVariables = birthday
$secret in displayFirstPackageVariables = new year
-----------------------------------------------------------------------
 
 
阅读(1531) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~