[perl]名称空间namespace、包package和模块
# perl 用 包 或 名称空间来决定变量和子程序标示符的可访问性。也可以用包来访问在其他名为模块的文件中定义的标示符 # perl 的大多数作用域规则都是自 包 的概念衍生出来的 # 每个包都有自己的符号表 其中包含的所有的变量和子程序名字,默认情况下perl源码文件中的全局标示符属于main包的符号表的一部分。事实上,perl没有真正的全局变量,应该叫做报变量。 # 字典变量不会插入到包的符号表中。每个定义了字典变量的代码块都有它自己的一个临时存储区域,专门用来保存字典变量,叫做 草稿区。 # 对于包来说,它的符号表就是一个散列--标示符为键,内存位置为值。 ? # package 定义一个包 package PackageName; # package 定义一个包 our $variable="varlue"; # 定义包变量 my $secret = "my varlue"; # 定义字典变量 # 字典变量 只能在定义的文件内使用 ? # require 导入一个包 require PackageName; # 导入一个包 # require 关键字指示 perl 找到一个名为 PackageName.pm 的包,并把它添加到当前程序中。 # 首先在当前目录中查找这个包文件,如果没有找到就会在由数组 @INC 指定的目录中查找。在任何时候只要指示 perl 把一个文件包括进来,perl 就会在当前目录和 @INC 指定的目录进行查找。require 关键字已经假定有一个.pm的扩展名,所以pm后缀可加可不加。使用require 包括的到程序里的包会在程序执行期间载入。 $PackageName::variable; # 操作一个包变量 $main::varibale; # 操作一个main包中的变量 当不加包名称时 默认使用当前包 ? # 模块和use语句 # 模块本质上就是一种包,它可以让在不提供全名称的情况下使用模块中定义的标示符,就像在当前包中定义的一样 # 定义包 -------- FirstModule.pm --------- #! /usr/bin/perl # Fig 6.20: FirstModule.pm # Our first module. ? package FirstModule; # 定义包名 ? # the following two lines allow this module to export its # identifiers for use in other files. use Exporter; # user module Exporter # 导入 Exporter 包 our @ISA=qw(Exporter); # this module " is a " Exporter # 通过特殊的内建数组 @ISA 设定当前包为模块 # @array and &greeting are imported automatically into a # file that uses this module our @EXPORT=qw(@array &greeting); # 设定 @array 数组和 &greeting 子程序为 要导入到其他名称空间的标示符 our @array=(1..3); # 声明 @array 数组 sub greeting{ # 声明 &greeting 子程序 ? print "Modules are handy!"; } return 1; # indicate successful import of module # 告诉导入者 当前模块导入成功 -------- end FirstModule.pm --------- use FirstModule ; # 导入 FirstModule 模块 # use 导入模块文件后缀必须为.pm,但 require 可以使用其他后缀 # use 的特点 use v5.6.0 ; # 比较当前perl的版本号,如果比指定的版本小,便会产生严重错误,而中止程序 use FirstModule 2.0; # 比较倒入模块的版本 如果导入的模块的版本过低,便会产生严重错误,而中止程序 our $VERSION=2.0; # 设定当前模块的版本号 use FirstModule qw( @array ); #只从模块中导入指定的 @array 数组 no # 不从指定的名称空间里导入指定项目 ,语法等价于 use # 预编译指令 use strict,use warnings use strict ;# 强迫声明时添加 作用域 全局或字典;强迫使用引号封闭字符串;强迫明确调用每个子程序。 use strict 'vars'; # 强迫声明时添加 作用域 全局或字典; use strict 'subs';# 强迫使用引号封闭字符串;强迫明确调用每个子程序。 use vars qw( 变量1 变量2 ); # 声明全局变量 use warnings; # 打印警告信息 no strict; # 关闭语法检查 use constant PI => 3.1415926; # 创建常量标示符 use diagnostics; #启用诊断效果 ? enable(); # 开启诊断 ? disable(); # 禁用诊断 use integer; # 采用整数运算方式 ? ------------------------------------------------------------------- -- codes -- http://www.perlchina.org/archive/archive.php?action=archive&page=33 package MyModule; # 定义包名 ? use strict; # 强制语法检查 use Exporter; # 导入 Exporter use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); # 声明全局包变量 ? $VERSION???? = 1.00; # 声明版本号 @ISA???????? = qw(Exporter); # 使用 Exporter 设定当前包可用于模块 @EXPORT????? = (); # 声明被导出的标示符为所有全局包变量 @EXPORT_OK?? = qw(func1 func2); # 声明被导出的函数 %EXPORT_TAGS = ( DEFAULT => [qw(&func1)], ???????????????? Both??? => [qw(&func1 &func2)]); # 定义输出标签 # 函数声明 sub func1? { return reverse @_? } sub func2? { return map{ uc }@_ } ? 1; # 返回值 指示导入包成功 -- end codes -- -------------------------------- 结果输出 ????????? hello,world (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |