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的版本用于模拟传递引用的方式,仍存在于现在版本中,但是现在引用很好用。 下面有一个例子:
![](https://img-my.csdn.net/uploads/201212/03/1354537396_9078.jpg)
这样就传了引用,就可以改变@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新的规则所掩盖或替代,而且可以用其他有效的方式来实现。
最后英语太烂,看的我头晕眼花....很多地方没看明白...还是多多看前面那篇文章或者相关的代码,所有的内涵都在代码之中。