[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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值