我正在编写一个Perl模块,它涉及一些非常复杂的正则表达式,如果没有工具来帮助我几乎无法调试。我认为Regexp::Debugger
模块对于这项工作来说是完美的工具,但它似乎只适用于.pl
脚本,并且似乎不适用于.pm
模块。
例如,这有效:
test.pl
use strict;
use warnings;
use Regexp::Debugger;
my $text = "text";
if ($text =~ /tex/) {
print "Match!";
}
我得到了预期的调试功能。
但是第二个我介绍了一个Perl模块,它不再起作用了:
test.pl
use strict;
use warnings;
use TestModule;
TestModule::func();
TestModule.pm
package TestModule;
use strict;
use warnings;
use Regexp::Debugger;
sub func {
my $text = "text";
if ($text =~ /tex/) {
print "Match!";
}
}
1;
尝试运行此代码会出现以下错误:
不能在Regexp / Debugger.pm第160行使用未定义的值作为HASH参考
简单地在“test.pl”文件中包含Regexp::Debugger
而不是工作,因为它不会尝试在包含的模块中调试正则表达式。
我怎样才能使这个工作,所以我可以在我正在处理的模块中调试正则表达式?
已提交错误报告,现在CPAN上的新版本(v0.002001)可按预期工作。 :)
答案 0 :(得分: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'};
也许它应该((caller 1)[10] || {})->{'Regexp::Debugger::lexical_scope'}
代替?
无论如何,我能够重现你的问题,我找到了一个解决方法。在test.pl
中,执行:
use strict;
use warnings;
no Regexp::Debugger;
use TestModule;
即。在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.
......这仍然是一个错误,但这是一个很好的错误。这意味着Regexp::Debugger
没有问题。
如果我在1
末尾添加一行TestModule.pm
,那么一切正常。
更新: OP reported the problem和it was fixed。