2009年12月21日星期一

perlxstut: perl内部数据类型

XS variable type Table

Name      variable type   C structure     Perl function
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 = 4

type字段包含有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 单行道

没有评论: