SvNULL SVt_NULL None undef
SvIV SVt_IV xpviv Integer
SvNV SVt_NV xpvnv Floating-point number
SvRV SVt_RV xrv Reference or undef
SvPVIV SVt_PVIV xpviv or xpvuv String and/or number
SvPVNV SVt_PVNV xpvnv Float, string and/or integer
SvPVMG SVt_PVMG xpvmg Magic
SvPVAV SVt_PVAV xpvav Array
SvPVHV SVt_PVHV xpvhv Hash
SvPVGV SVt_PVGV xpvgv Glob
所有的类型都是从SvNULL(也可直接成为SV)继承过来,一个SvNULL结构如下
ANY是指向其他结构的一个指针,从SvNULL继承过来的其他类型主要就是靠这个指针来获得数据。REFCNT是perl变量的一个重要属性,创建一个变量时,引用计数为1。为这个变量创建一个引用,则计数增加1。当引用计数为0时,perl即认为这个变量可以被释放内存。Devel::Peek可以用来查看一个变量的引用计数。
perl -MDevel::Peek -e 'my $a="a"; Dump $a;$b=\$a;Dump $a';
SV = PV(0x863f6ec) at 0x8642964
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x8652adc "a"\0
CUR = 1
LEN = 4
SV = PV(0x863f6ec) at 0x8642964
REFCNT = 2
FLAGS = (PADMY,POK,pPOK)
PV = 0x8652adc "a"\0
CUR = 1
LEN = 4type字段包含有sv的类型,其值为上表中之一
FLAGS 字段有 24 个标志位,它将说明这个对象的各个字段应该怎样解释,还包含其它状态信息。一些标志只是用于优化,避免解除许多层的指针引用,结果发现信息不在那里,如下所示,具体含义见cpan illguts
给出几个典型的SV类型:SvRV:
SvPVNV:
SvPVMG:
可以看到perl里面的复杂数据对象都是在SvNull上面添加其他数据结构而来的。继承关系如下:
SvPVMG: 在perl里面,SvPVMG被成为"magic variable",当这个变量被访问时,一些函数会被触发。比如tie变量,%SIG,被bless过的类变量等。词法变量和包变量:Perl使用namespace来区分不同包的变量,包变量保存在symbol table hash(stash)里面,默认的namespace是main::,每个namespace都由一个hash组成,hash的键值是变量的名字,而hash的值就是一个GV,其中包含所有共享这个变量名的变量值。
词法变量是生存期与代码块相关的变量。每个CV(code block)包含一个叫做padlist的数组引用,这个数组的第一个entry包含所有词法变量,第二个是其对应的值,还有第三个是为了解决递归代码快所使用的。更多详尽信息,参见perlguts,perlapi,illguts.
Posted via email from 单行道

没有评论:
发表评论