在perl特殊令牌中,例如__PACKAGE__
,__SUB__
,__FILE__
,__LINE__
存在且可从脚本中获取。
我想,__PACKAGE__
XS
可能会HvNAME( PL_currstash )
的价值为XS
。
但是如何访问他人?
是否有专门的界面可以从CTX->package
访问所有这些界面?例如:CTX->sub
,$s = Get-SPWeb "http://homesite"
if (!$s.Sites) {Write-Error "Invalid Key used!"}
等。
答案 0 :(得分:3)
您可以在toke.c
中逐个查找编译时值:
__PACKAGE__
=> HvNAME(PL_curstash)
或PL_curstname
__FILE__
=> CopFILE(PL_curcop)
(在编译时)__LINE__
=> CopLINE(PL_curcop)
(在编译时)__SUB__
=> PL_compcv
如果在运行时需要它们,请查看上下文caller_cx
和当前子(cv
)中可用的各种数据字段。没有像parrot或perl6传递的上下文结构,而是一堆活动的上下文块。
答案 1 :(得分:2)
Perl子例程用C表示,类型为CV
。 XSUB的CV
在cv
参数中传递:
#define XSPROTO(name) void name(pTHX_ CV* cv)
您可以使用GvNAME(CvGV(cv))
获取XSUB的名称。如果您使用多个名称注册XSUB(例如使用ALIAS
或INTERFACE
关键字或在类型地图中注册),这将非常有用。
要获取当前存储(__PACKAGE__
等效),我建议使用CvSTASH(cv)
。
__FILE__
和__LINE__
由C编译器提供为宏。
答案 2 :(得分:2)