wiki:advancedperlprogrammingnotes

Wiki: Advanced Perl Programming Notes

2007/1/4

typeglob

什么是typeglob

typeglob是符号表与具体数据类型之间的一种数据结构,typeglob变量用前缀"*"表示。

symbol table -> typeglob -> variable type

+------+

| |------> $var(scale)

+-----+ | |------> @var(array)

| var |-------->| *var |------> %var(hash)

+-----+ | |------> &var(produce)

| |------> var(file handler)

| |------> var(print format)

+------+

local和my

local操作符

local属于 动态作用域 它只操作 符号表 中的全局变量,它先将 变量值保存,然后在代码块结束的时候再恢复原有值。

my操作符

my属于 词法作用域 它不在 符号表 中出现,它们是真正的局部变 量,它们存在于不同的子例程或者代码块的变量数组中,并且是各自独立的。当用 my声明变量时,会新建变量,并且该变量只对该代码块可见。

所以,如果使用my来操作typeglob,比如my(F),将会报告错误。

** local局部化typeglob local保存变量的值并在代码块结束时恢复该值,而my将创建一个新的变量。

别名

一旦进行了typeglob别名赋值,所有原名字的实体均可以使用新的别名来指代,因 此此时符号表中的条目,均指向相同的typeglob值。

typeglob alias

+------+

| |------> $var(scale)

+-----+ | |------> @var(array)

| var |-------->| *var |------> %var(hash)

+-----+ |*alias|------> &var(produce)

+--->| |------> var(file handler)

+-------+ | | |------> var(print format)

| alias |--+ +------+

+-------+

局部别名

别名的作用

高效的参数传递

因为别名不存在间接访问操作,所以它比引用速度快很多。

$a = 10;

*b = *a; $b++;

$r = \$a; $$r++;

在命令行上使用别名

使用别名来创建友好的预定义变量