perl中的typeglob(二)
http://perldoc.perl.org/perldata.html#Typeglobs-and-Filehandles 1.typeglobs 和文件句柄 上回说到,有符号表这么个东西,?一个符号b?映射一个?glob,里面可以有多个变量,相当一个1对多的hash
*b{SCALAR}=$b; *b{HASH}=%b; *b{ARRAY}=@b; 由于=好被重载,不需要写明{array} ;直接*b = $b,*b =&;b; 就行。 现在讲讲这个typeglob 和fh。 由于现在perl中有ref 引用的,所以很少用到typeglob, 主要有以下几个用处。 1.别名, ?*this = *that ? ? ? 则 $this = $that @this = @that,不想全改就可以local*Here::blue = $There::green; 只复制scalar标量的部分。 2 pass filehandles into a function or to create new filehandles 给函数传递文件句柄或者创建一个文件句柄,要配合local()(另一个作用是操作 符号变量如$) $fh = *STDOUT; 或者*STDOUT; 后者$fh 是一个glob的引用。 下面这个例子是一个很典型的用法: sub newopen { ? ?另外,如果 给open等函数传递一个未初始化的标量,那么函数将创建一个匿名的文件句柄,而$fh 是一个glob的引用 sub myopen { print ref $fh; ?但是若 $fh已初始化, 例如: no strict 'refs'; 这里给符号表中zzz 对应的glob创建了一个文件句柄的条目,这相当于直接操作了符号表。 2.perlsub----Passing Symbol Table Entries (typeglobs) http://perldoc.perl.org/perlsub.html#Passing-Symbol-Table-Entries-(typeglobs) 注:本小节描述的机制是早期perl的版本用于模拟传递引用的方式,仍存在于现在版本中,但是现在引用很好用。 下面有一个例子: 这样就传了引用,就可以改变@foo的值了。 另外,现在的版本@_ 已经是传引用的了,如下: 但是可以用?
3.perlref 关于引用,自己已经用的比较熟悉了,的确非常好用,就不继续看了 关于引用的机制以后再研究一下。 4.符号表 http://perldoc.perl.org/perlmod.html#Symbol-Tables 一个包的符号表 存储在 ?%packagename:: 的 hash表中。 ?main 包的符号表 在 %main:: 中,也可写成%:: ?。 后面有很多重复的地方,略。 *PI = 3.14159265358979; $PI不能改变 不过现在也能用useconstantPI=>4 *atan2(1,1); ,感觉更方便一点。 总之: 实际上,理解 符号表和typeglob 的关系,就能了解到他们的原理,而以上的这些,在我看来,已经被perl新的规则所掩盖或替代,而且可以用其他有效的方式来实现。 最后英语太烂,看的我头晕眼花....很多地方没看明白...还是多多看前面那篇文章或者相关的代码,所有的内涵都在代码之中。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |