我有 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>);
问题是我得到了
未定义的子程序&amp; main :: print_diagnostic在...处调用
使用显式包名称TestUtils::print_diagnostic
调用该函数可以正常工作,但出于各种原因,我确实希望将其称为没有这样的前缀。
use test_utils qw(print_diagnostic);
和
require test_utils;
产生相同的结果。
我已经挖掘了几十个类似的问题,尝试了答案和解决方案,但所有这些似乎对我没用,而且我得到了真的很困惑&#34; export&#34;,&#34; import&#34;以及围绕它的所有事情,我无法抓住这些概念,因此比较C ++和Java,这是违反直觉的。
我想要做的就是将非常复杂的脚本分成几个模块并重用代码(现在有很多重复)。
答案 0 :(得分:4)
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;
如果使用了脚本的符号链接,您的版本将会中断。