您的位置:首页 > 其它

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

2017-02-24 19:20 525 查看
概念

相互的联系

用代码展示

写一段代码时,要为这个代码提供它自己的命名空间,这样你的变量和函数就不会与其他人的变量/函数冲突,反之亦然。命名空间有点像你自己的家,在这里你可以随心所欲,房间里怎么乱都行,只要保证从外面看起来还不错。在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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐