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++;
在命令行上使用别名
使用别名来创建友好的预定义变量