在同一目录中使用模块。 "在"

时间:2017-10-30 15:24:11

标签: perl perl-module perl-exporter

我有 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,这是违反直觉的。

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

1 个答案:

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

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