在同一目录中使用模块。 "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;
如果使用脚本的符号链接,您的版本将会中断。
我有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;
如果使用脚本的符号链接,您的版本将会中断。