我已将脚本的一部分移动到一个模块中,现在我做错事时唯一的错误是“Undefined subroutine”,即使真正的错误是我拼错了一个变量,或者忘记了关闭paren ,或者留下一个分号。
找到真正错误的唯一方法是将整个事物复制到脚本中并以这种方式运行。这很乏味。我做错了什么,或者这只是模块应该工作的方式?
这是一个非常简单的示例,显示了问题:
模块:
#!/usr/bin/env perl
package CalledError;
use Exporter qw(import);
our @EXPORT_OK=qw(do_build_stor_pools);
use strict;
use warnings;
use feature qw(say);
sub do_build_stor_pools {
say "now in CalledError do_build_stor_pools";
#my $undef_var="uncomment this to fix";
say $undef_var;
return;
}
调用脚本:
#!/usr/bin/env/perl
use strict;
use warnings;
my $buildstor_mod="CalledError";
eval "require $buildstor_mod";
$buildstor_mod->import();
CalledError::do_build_stor_pools();
像这样运行得到
Undefined subroutine &CalledError::do_build_stor_pools called at calling_test.pl line 11.
取消注释$undef_var
的定义以使其有效。
答案 0 :(得分:4)
如果你检查了$ EVAL_ERROR,你会看到真正的错误:
#!/usr/bin/env/perl
use strict;
use warnings;
my $buildstor_mod="CalledError";
eval "require $buildstor_mod";
if ($@) {
die "$@";
}
$buildstor_mod->import();
CalledError::do_build_stor_pools();
错误讯息:
Global symbol "$undef_var" requires explicit package name at CalledError.pm line 15.
Compilation failed in require at (eval 1) line 2.
您会看到未定义的子例程错误,因为require
失败。
答案 1 :(得分:3)