Regexp :: Debugger Perl模块似乎不能在另一个Perl模块中工作

tjw*_*992 6 regex debugging perl perl-module

我正在编写一个Perl模块,它涉及一些非常复杂的正则表达式,如果没有工具来帮助我几乎无法调试.我认为该Regexp::Debugger模块将是完成该工作的完美工具,但它似乎只能在.pl脚本中工作,并且似乎不能在.pm模块中工作.


例如,这有效:

test.pl

use strict;
use warnings;
use Regexp::Debugger;

my $text = "text";
if ($text =~ /tex/) {
    print "Match!";
}
Run Code Online (Sandbox Code Playgroud)

我得到了预期的调试功能.


但第二个我介绍了一个Perl模块,它不再起作用:

test.pl

use strict;
use warnings;
use TestModule;

TestModule::func();
Run Code Online (Sandbox Code Playgroud)

TestModule.pm

package TestModule;

use strict;
use warnings;
use Regexp::Debugger;

sub func {
    my $text = "text";
    if ($text =~ /tex/) {
        print "Match!";
    }
}

1;
Run Code Online (Sandbox Code Playgroud)

尝试运行此代码会出现以下错误:

不能在Regexp/Debugger.pm第160行使用未定义的值作为HASH参考

简单地包含Regexp::Debugger在"test.pl"文件中也不起作用,因为它不会尝试在包含的模块中调试正则表达式.

我怎样才能使这个工作,所以我可以调试我正在工作的模块中的正则表达式?


更新:

已提交错误报告,现在CPAN上的新版本(v0.002001)可按预期工作.:)

mel*_*ene 6

这似乎是Regexp :: Debugger在调用范围中检查词法提示的方式中的一个错误,但我不确定如何修复它.作为参考,https://metacpan.org/source/DCONWAY/Regexp-Debugger-0.002000/lib/Regexp/Debugger.pm#L160是:

my $lexical_scope = (caller 1)[10]{'Regexp::Debugger::lexical_scope'};
Run Code Online (Sandbox Code Playgroud)

也许它应该做((caller 1)[10] || {})->{'Regexp::Debugger::lexical_scope'}呢?


无论如何,我能够重现你的问题,我找到了一个解决方法.在test.pl,做:

use strict;
use warnings;
no Regexp::Debugger;
use TestModule;
Run Code Online (Sandbox Code Playgroud)

Regexp::Debugger在您之前加载use TestModule,但no不要use避免为主程序激活它.

有了这个改变,我得到:

TestModule.pm did not return a true value at test.pl line 4.
BEGIN failed--compilation aborted at test.pl line 4.
Run Code Online (Sandbox Code Playgroud)

......这仍然是一个错误,但这是一个很好的错误.这意味着没有问题Regexp::Debugger.

如果我再添加一行1在结束TestModule.pm,一切正常.


更新: OP 报告了该问题,并在Regexp :: Debugger版本0.002001中修复.