Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl源代码中找到某些函数的实现?_Perl - Fatal编程技术网

如何在Perl源代码中找到某些函数的实现?

如何在Perl源代码中找到某些函数的实现?,perl,Perl,例如,我想查找“print”或“foreach”运算符的源代码。 我已经下载了Perl源代码,希望看到这个操作符的“真实”代码。Perl将源代码编译成一个称为操作码树的图形。同时,此数据结构表示程序的语法和控制流。要理解操作码,您可能需要从开始 要了解您的程序编译到了什么操作,您可以这样称呼它: perl-MO=简明脚本.pl–在语法树中获取操作码 perl-MO=concurrence,-exec script.pl–改为使用-exec选项按其执行顺序命令操作。有时候,这就不那么令人困惑了

例如,我想查找“print”或“foreach”运算符的源代码。
我已经下载了Perl源代码,希望看到这个操作符的“真实”代码。

Perl将源代码编译成一个称为操作码树的图形。同时,此数据结构表示程序的语法和控制流。要理解操作码,您可能需要从开始

要了解您的程序编译到了什么操作,您可以这样称呼它:

  • perl-MO=简明脚本.pl
    –在语法树中获取操作码
  • perl-MO=concurrence,-exec script.pl
    –改为使用
    -exec
    选项按其执行顺序命令操作。有时候,这就不那么令人困惑了
  • perl-MO=concrete,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
输出(此处不带颜色):

所以它在
pp_hot.c
第40行声明。我倾向于做
vim pp_hot.c+40
去那里。然后我们看到定义:

PP(pp_const)
{
    dVAR;
    dSP;
    XPUSHs(cSVOP_sv);
    RETURN;
}

要理解这一点,您应该了解最基本的知识,或许可以写一点XS。

谢谢您的回答。所以,如果我有相同的输出,这意味着两个操作符有相同的代码?比如:bash-4.1$perl-MO=concrete-e“for(1,2,3){};“bash-4.1$perl-MO=concrete-e”foreach(1,2,3){};“@helgi Yes。操作码是程序的直接表示形式。如果两个程序具有相同的操作码,则它们的行为完全相同。(在您的例子中,在某些地方记录了
for
foreach
关键字是相同的。但是,在创建操作码之前,解析器会消除这种差异。)
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(pp_const)
{
    dVAR;
    dSP;
    XPUSHs(cSVOP_sv);
    RETURN;
}