什么是;代码(0x1431a90)";是指Perl调试器何时为$DB::sub输出此值?
对于从一个简单的自定义Perl调试器获得的输出,我有一个问题 如果我有这样一个简单的Perl调试器:什么是;代码(0x1431a90)";是指Perl调试器何时为$DB::sub输出此值?,perl,debugging,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 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-dtest.pl
调用):
并且输出沿以下线路:
main CODE(0x1431a90)
main strict::import
main strict::bits
main CODE(0x1431be0)
main warnings::import
main::hello
hello world
我的问题是:
“代码(0x1431a90)”部分代表什么?它似乎代表了程序的主体——因为在最顶层没有子例程,这似乎是对程序主执行的内存引用
当我看到调试器打印出“代码(…)”时,我可以对它的含义做出哪些假设?它总是这个“主”代码路径吗?有没有其他特殊的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
code(0x1431a90)
是代码引用的字符串化。它是代码引用,可能是匿名引用。请参阅中的coderef2text
方法以获取(近似)实际源代码,并显示文件和行号(您已经从调用方中提取了行号)以查找从何处调用sub
在示例脚本上运行B::Deparse::coderef2text
,代码引用解析为
require strict;
do {
'strict'->import
};
及
这意味着它们是由perl
从use strict
和use warnings
语句中生成和调用的。谢谢。因此,这些代码引用似乎符合use strict代码>和使用警告代码>-它们是代码引用,因为main中的调用行不在子例程中吗?但是如果是这样的话,那么在我刚刚添加的修改后的示例中,为什么主hi
显示时没有代码引用?谢谢非常感谢-非常有帮助
require strict;
do {
'strict'->import
};
use strict 'refs';
require warnings;
do {
'warnings'->import
};