# 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
# 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