例如,我想找到'print'或'foreach'运算符的源代码。 我已经下载了Perl源代码,希望看到这个运算符的“真实”代码。
答案 0 :(得分:10)
Perl将源代码编译为名为操作码树的图形。同时,此数据结构表示程序的语法和控制流程。要理解操作码,您可能需要从Illustrated Perl Guts (illguts)开始。
要了解您的程序编译的Ops,您可以这样称呼它:
perl -MO=Concise script.pl
- 在语法树中获取操作码perl -MO=Concise,-exec script.pl
- -exec
选项会在执行顺序中对操作进行排序。有时,这不会令人困惑。perl -MO=Concise,foo script.pl
- 转储foo
子程序的操作。典型的操作码如下:
4 <$> const[PV "007B"] s/FOLD ->5
^ ^ ^ ^ ^
| | | | The next op in execution order
| | | Flags for this op, documented e.g. in illguts. "s" is
| | | scalar context. After the slash, op-specific stuff
| | The actual name of the op, may list further arguments
| The optype ($: unop, 2: binop, @:listop) – not really useful
The op number
Ops声明为PP(pp_const)
。要搜索该声明,请使用ack
tool,它是带有Perl正则表达式的智能递归grep
。要搜索源代码顶部的所有C文件和标题,我们会这样做:
$ ack 'pp_const' *.c *.h
输出(此处没有颜色):
op.c
29: * points to the pp_const() function and to an SV containing the constant
30: * value. When pp_const() is executed, its job is to push that SV onto the
pp_hot.c
40:PP(pp_const)
opcode.h
944: Perl_pp_const,
pp_proto.h
43:PERL_CALLCONV OP *Perl_pp_const(pTHX);
所以它在pp_hot.c
,第40行宣布。我倾向于vim pp_hot.c +40
去那里。然后我们看到了定义:
PP(pp_const)
{
dVAR;
dSP;
XPUSHs(cSVOP_sv);
RETURN;
}
要理解这一点,你应该对Perl API有一点了解,也许可以写一点XS。