在 perl 中,诸如__PACKAGE__
, __SUB__
, __FILE__
,之类的特殊标记__LINE__
存在并且可从脚本中获得。
__PACKAGE__
我想我可能会从XS
as中获得价值HvNAME( PL_currstash )
。
但是如何访问其他人?
是否有特殊的界面可以访问所有这些XS
?比如:CTX->package
等CTX->sub
。
您可以一一查找它们以toke.c
获取编译时值:
__PACKAGE__
=>HvNAME(PL_curstash)
或PL_curstname
__FILE__
=> CopFILE(PL_curcop)
(在编译时)__LINE__
=> CopLINE(PL_curcop)
(在编译时)__SUB__
=>PL_compcv
如果您在运行时需要它们,请查看上下文caller_cx
和当前子 ( cv
) 中可用的各种数据字段。没有在 parrot 或 perl6 中传递的上下文结构,而是一堆活动的上下文块。
Perl 子例程在 C 中用 type 表示CV
。XSUB的参数CV
在参数中传递cv
:
#define XSPROTO(name) void name(pTHX_ CV* cv)
您可以使用 . 获取 XSUB 的名称GvNAME(CvGV(cv))
。如果您在多个名称下注册 XSUB,例如使用ALIAS
orINTERFACE
关键字或在类型映射中,这将特别有用。
要获得当前的存储(__PACKAGE__
等效),我建议使用CvSTASH(cv)
.
__FILE__
并由__LINE__
C 编译器作为宏提供。