Perl在模块中抛出未定义的子例程而不是正确的错误

时间:2014-10-02 19:54:41

标签: perl perl-module

我已将脚本的一部分移动到一个模块中,现在我做错事时唯一的错误是“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的定义以使其有效。

2 个答案:

答案 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)

您未检查eval的错误情况:

eval "require $buildstor_mod";
die $@ if $@;

但是,要加载模块,您应该只使用use

use strict;
use warnings;

use CalledError qw(do_build_stor_pools);

do_build_stor_pools();

输出:

Global symbol "$undef_var" requires explicit package name at CalledError.pm line 14.