您好、欢迎来到现金彩票网!
当前位置:21点 > 子例程 >

Perl 中的 Typeglob 及 Exporter 工作原理

发布时间:2019-07-22 06:17 来源:未知 编辑:admin

  Perl 中每个包,都有一个符号表,存放了当前包中定义的变量和子例程。符号表是一个名字为

  仅有使用our定义的变量才会被记录进符号表里,而使用my定义的变量不会被记录,没有使用这两个关键词定义的变量默认为our定义的,所以会记录进符号表。

  上面的代码中$b是一个字符串,而非引用,但是当解引用时,它还有一次证明它自己的机会:用字符串的值当作它所引用的变量的名字。因此确定$b不是引用后,Perl 会寻找一个名为 ‘a’ 的变量,正好找到了,因此$b就可以看作$a的引用,而$$b就是$a。

  由于最近的版本(忘了哪个了)默认添加了use strict,无法使用符号引用,所以需要使用 =no strict ‘refs’= 开启符号引用支持。

  Perl 中变量分为几种类型:标量,列表,哈希等等,并以不同的前缀表示。名字相同但是变量前缀不同的变量之间是可以独立使用的。

  上面说到符号表的键是变量名,由于散列表的键不能重复,那么符号表是怎么保存名字相同但独立的变量的呢?

  实际上在符号表和变量值之间存在一个叫做 Typeglob 的结构,Typeglob 中保存了一组指向各种类型的值的指针,而符号表中保存了 Typeglob 结构的指针,所以上面遍历输出符号表时看到的是值为*开头的 Typeglob 结构。

  使用前缀*可以获取一个变量名的 Typeglob 结构,也可以在 Typeglob 结构添加不同类型的前缀解引用获得对应类型的值。

  到这里,Exporter 实现的原理也就很明白了:将目标包中的若干子例程对应的 Typeglob 注入到当前包中,便可以省略前缀调用了。了解了这个原理,就可以写个简易的 MyExporter 包了。

  上一篇文章中说到,使用use加载包时,会自动调用包里的import子例程

http://korinkorin.com/zilicheng/215.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有