在同一目录中使用模块。 "Undefined subroutine called at"

Using module in the same directory. "Undefined subroutine called at"

我有test_utils.pm:

package TestUtils;
use strict;
use warnings;

use Exporter 'import';
our @EXPORT = qw / print_diagnostic /;

sub print_diagnostic { <some_code_here> }

我想从位于同一文件夹中的主脚本 tester.pl 中调用 print_diagnostic(我使用 this solution):

#!/usr/bin/perl
use lib dirname (__FILE__);
use test_utils qw (:ALL);

print_diagnostic(<some_message>);

问题是我得到了

Undefined subroutine &main::print_diagnostic called at ...

用明确的包名TestUtils::print_diagnostic调用函数工作正常,但出于各种原因我确实想调用它w/o这样的前缀。

use test_utils qw(print_diagnostic);

require test_utils;

产生相同的结果。

我已经研究了几十个类似的问题,尝试了答案并 "solutions",但所有这些似乎都不适合我,我真的很困惑 "export", "import" 和它周围的所有东西,我无法抓住这些概念,所以违反直觉,比较 C++ 和 Java.

我想做的就是将非常复杂的脚本拆分成几个模块并重用代码(现在有很多重复)。

use test_utils qw( :ALL );

相当于

BEGIN {
   require test_utils;
   import test_utils qw( :ALL );
}

但你想要

BEGIN {
   require test_utils;
   import TestUtils qw( :ALL );
}

为文件和包使用相同的名称以避免此问题。


顺便说一句,你应该更换

use File::Basename qw( dirname );
use lib dirname(__FILE__);

use Cwd qw( abs_path );
use File::Basename qw( dirname );
use lib dirname(abs_path(__FILE__));

或者干脆

use FindBin qw( $RealBin );
use lib $RealBin;

如果使用脚本的符号链接,您的版本将会中断。