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; 或者$fh = \*STDOUT; 后者$fh 是一个glob的引用。 下面这个例子是一个很典型的用法:

sub newopen {
my $path = shift;
local *FH;# not my!
open(FH,$path) or return undef;
return *FH;
}
$fh = newopen('/etc/passwd');

   另外,如果 给open等函数传递一个未初始化的标量,那么函数将创建一个匿名的文件句柄,而$fh 是一个glob的引用

sub myopen {
open my $fh,"@_" r die "Can't open '@_': $!";

print ref $fh;
return $fh;
}

 但是若 $fh已初始化, 例如:

no strict 'refs';
my $arg = 'zzz';
open($arg ,"d://2.txt")

这里给符号表中zzz 对应的glob创建了一个文件句柄的条目,这相当于直接操作了符号表。

2.perlsub----Passing Symbol Table Entries (typeglobs)

http://perldoc.perl.org/perlsub.html#Passing-Symbol-Table-Entries-(typeglobs)


注:本小节描述的机制是早期perl的版本用于模拟传递引用的方式,仍存在于现在版本中,但是现在引用很好用。 下面有一个例子:

这样就传了引用,就可以改变@foo的值了。

另外,现在的版本@_ 已经是传引用的了,如下:


但是可以用 * mechanism 或者引用 进行push pop 操作或者改变 array的大小。换句话说, pop @_ ,  push @_ ,$a 是不会改变@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新的规则所掩盖或替代,而且可以用其他有效的方式来实现。


最后英语太烂,看的我头晕眼花....很多地方没看明白...还是多多看前面那篇文章或者相关的代码,所有的内涵都在代码之中。


posted @ 2012-12-03 21:51  程序员杰诺斯  阅读(236)  评论(0编辑  收藏  举报