perl——深入理解(包、命名空间、符号表、类型团、GLOB、变量和函数)
2017-02-24 19:20
525 查看
概念
相互的联系
用代码展示
写一段代码时,要为这个代码提供它自己的命名空间,这样你的变量和函数就不会与其他人的变量/函数冲突,反之亦然。命名空间有点像你自己的家,在这里你可以随心所欲,房间里怎么乱都行,只要保证从外面看起来还不错。在Perl中,命名空间称为包(package)。包提供了基本结构模块,基于这些构造模块,可以构建更高层的模块和类概念。(引自P《Programming Perl》)
通常包只是一个文件,在一个文件中放一个包,文件名和包名相同,并且使用.pm(perl module)作为扩展名。
包是独立于文件的,一个文件中可以有多个包,一个包也可能跨多个文件(不讨论)。
命名空间
Perl中,命名空间称为包。
所以一个.pm不一定只有一个命名空间。
符号表
包的内容称为符号表(symbol table)。一个包就是一个符号表。
符号表存储在一个散列中,这个散列与包同名,并且要在后面追加
符号表的键是符号标识符,值是对应的类型团。
类型团
Perl中的一个特殊类型(typeglob),类型团的类型前缀是
类型团是可理解成一个散列结构的数据结构,其键是固定的,包含
GLOB
类型团数据的数据类型就是GLOB。
输出类型团的数据类型
访问类型团,证明其实散列结构
变量和函数
命名空间中的变量和函数,可以通过符号表的类型团访问。
但是符号表机制对词法作用域变量不可见。(my state是词法作用域变量)
相互的联系
用代码展示
写一段代码时,要为这个代码提供它自己的命名空间,这样你的变量和函数就不会与其他人的变量/函数冲突,反之亦然。命名空间有点像你自己的家,在这里你可以随心所欲,房间里怎么乱都行,只要保证从外面看起来还不错。在Perl中,命名空间称为包(package)。包提供了基本结构模块,基于这些构造模块,可以构建更高层的模块和类概念。(引自P《Programming Perl》)
概念
包通常包只是一个文件,在一个文件中放一个包,文件名和包名相同,并且使用.pm(perl module)作为扩展名。
包是独立于文件的,一个文件中可以有多个包,一个包也可能跨多个文件(不讨论)。
命名空间
Perl中,命名空间称为包。
所以一个.pm不一定只有一个命名空间。
符号表
包的内容称为符号表(symbol table)。一个包就是一个符号表。
符号表存储在一个散列中,这个散列与包同名,并且要在后面追加
::。
main符号表就是
%main::,由于
main是默认的包,所以可以写作
%::。
符号表的键是符号标识符,值是对应的类型团。
类型团
Perl中的一个特殊类型(typeglob),类型团的类型前缀是
*,表示所有类型。
*foo包含
$foo @foo %foo &foo,以及foo的多种其他表示对应的值。
类型团是可理解成一个散列结构的数据结构,其键是固定的,包含
SCALAR
ARRAY
HASH
CODE
GLOB
IO
NAME
PACKAGE。
GLOB
类型团数据的数据类型就是GLOB。
输出类型团的数据类型
our a = 1; print "type of typeglob: ", ref \*main::a; # type of typeglob: GLOB
访问类型团,证明其实散列结构
our a = 1; print ${*main::a{SCALAR}}, ${*a{SCALAR}}; # 11
变量和函数
命名空间中的变量和函数,可以通过符号表的类型团访问。
但是符号表机制对词法作用域变量不可见。(my state是词法作用域变量)
相互的联系
用代码展示
our $val = 1; my %hash = qw(a aa b bb c cc); sub phash { print "\n" . $hash{ +shift } . "\n"; } ## 打印符号表 foreach my $key (keys %main::) { no strict; local *sys = $main::{$key}; print "KEY\t$key\t\tVALUE:\t @{[*sys]} \n"; } ## 类型团的数据类型就是GLOB print ref \*main::val; ## GLOB ## 从符号表中读取变量 print ${$main::{val}}, ${*main::val{SCALAR}},$main::val; ## 111 ## 类型团是一个散列,存储的值是引用 print *main::phash{CODE}; ## CODE(0x6b4718)
相关文章推荐
- ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->clone 函数
- 深入理解JavaScript系列(2) 揭秘命名函数表达式
- 执行xpath时提示,需要命名空间管理器或XsltContext。此查询具有前缀、变量或用户定义的函数
- python 函数 本地变量 函数的命名空间 变量的作用域
- 深入理解JavaScript系列 ----(2):揭秘命名函数表达式
- ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->contains 函数
- 深入理解JavaScript系列(2):揭秘命名函数表达式
- 深入理解JavaScript系列(2):揭秘命名函数表达式
- 深入理解C系列:不同类型变量的变量名和内存间的关系
- final类型变量的深入理解
- Flex 组成、变量、函数、命名空间
- 深入理解JavaScript系列(2):揭秘命名函数表达式
- 深入理解JavaScript系列(2):揭秘命名函数表达式
- 深入理解JavaScript系列(2):揭秘命名函数表达式
- ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->addRange 函数
- 深入理解JavaScript系列(2):揭秘命名函数表达式
- 深入剖析五大Perl变量类型使用
- 深入理解JavaScript系列(2):揭秘命名函数表达式
- JavaScript命名空间、函数参数类型重载的实现
- 深入理解JavaScript系列(2):揭秘命名函数表达式