perl——深入理解(包、命名空间、符号表、类型团、GLOB、变量和函数)

2017-02-24 20:52:49来源:CSDN作者:Aggressive_snail人点击

    • 概念
    • 相互的联系
    • 用代码展示

写一段代码时,要为这个代码提供它自己的命名空间,这样你的变量和函数就不会与其他人的变量/函数冲突,反之亦然。命名空间有点像你自己的家,在这里你可以随心所欲,房间里怎么乱都行,只要保证从外面看起来还不错。在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";}## 类型团的数据类型就是GLOBprint ref /*main::val;  ## GLOB## 从符号表中读取变量print ${$main::{val}}, ${*main::val{SCALAR}},$main::val; ## 111## 类型团是一个散列,存储的值是引用print *main::phash{CODE}; ## CODE(0x6b4718)

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台