我对从简单的自定义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
答案 0 :(得分:4)
这是一个代码参考,可能是匿名的。请参阅B::Deparse
中的coderef2text
方法以获取(近似值)实际源代码,并显示文件和亚麻(您已从caller
中提取)以查找sub来自。
在示例脚本上运行B::Deparse::coderef2text
,代码引用将解析为
require strict;
do {
'strict'->import
};
和
use strict 'refs';
require warnings;
do {
'warnings'->import
};
意味着它们是由perl
和use strict
声明中的use warnings
生成和调用的。
答案 1 :(得分:2)
CODE(0x1431a90)
是代码引用的字符串化。