加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl中的typeglob(二)

发布时间:2020-12-15 21:00:39 所属栏目:大数据 来源:网络整理
导读:http://perldoc.perl.org/perldata.html#Typeglobs-and-Filehandles 1.typeglobs 和文件句柄 上回说到, 有符号表这么个东西, ?一个符号b?映射一个?glob,里面可以有多个变量,相当一个1对多的hash *b{SCALAR}=$b; *b{HASH}=%b; *b{ARRAY}=@b; 由于=好被

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 {
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新的规则所掩盖或替代,而且可以用其他有效的方式来实现。


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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读