当Perl调试器为$ DB :: sub输出时,“CODE(0x1431a90)”是什么意思?

时间:2013-12-04 20:51:40

标签: perl debugging

我对从简单的自定义Perl调试器获得的输出有疑问。

如果我有一个像这个例子的简单Perl调试器:

package DB 
{
  sub DB {}

  sub sub
  { 
    my ($package, $filename, $line_num, $subroutine, $hasargs,
    $wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash) = caller(0);

    print "$package $DB::sub\n";

    &$DB::sub;
  }
}

1;

我在一个简单的程序上运行它,如下所示(通过perl -d test.pl调用):

#!/usr/bin/env perl

use strict;
use warnings;

sub hello
{
    print "hello world\n";
}

&hello;

输出结果如下:

main CODE(0x1431a90)
main strict::import
main strict::bits
main CODE(0x1431be0)
main warnings::import
 main::hello
hello world

我的问题是:

“CODE(0x1431a90)”部分代表什么?它似乎代表了程序的主体 - 因为在最顶层没有子程序,这似乎是对程序主要执行的内存引用。

当我看到我的调试器打印出“CODE(...)”时,我可以做出什么假设?这总是这个“主要”代码路径吗?是否有任何其他特殊的Perl变量可用于解释程序在该点的位置?

谢谢!


编辑 - 修订示例1:

参考评论中的讨论,增加了另外的例子:

#!/usr/bin/env perl

use strict;
use warnings;

sub hello
{
    print "hello world\n";
}

&hello;

print "hi from main\n";

输出:

main CODE(0x22f0a90)
main strict::import
main strict::bits
main CODE(0x22f0be0)
main warnings::import
 main::hello
hello world
hi from main

2 个答案:

答案 0 :(得分:4)

这是一个代码参考,可能是匿名的。请参阅B::Deparse中的coderef2text方法以获取(近似值)实际源代码,并显示文件和亚麻(您已从caller中提取)以查找sub来自。


在示例脚本上运行B::Deparse::coderef2text,代码引用将解析为

require strict;
do {
    'strict'->import
};

use strict 'refs';
require warnings;
do {
    'warnings'->import
};

意味着它们是由perluse strict声明中的use warnings生成和调用的。

答案 1 :(得分:2)

CODE(0x1431a90)是代码引用的字符串化。