【发布时间】:2018-06-13 16:16:36
【问题描述】:
我已经在包含Exporter 语句的更大代码块上浪费了很多天,这在大约一年前曾经可以工作。这方面的几个变体都失败了,包括安装 ./FOO/BAR/Foobar.pm 表示成功。
我使用的是 Windows 10,Perl v5.26.0,专为 MSWin32-x64-multi-thread 构建
来电者.pl
#!/usr/bin/perl
use lib ".";
use lib "./FOO/BAR";
use strict;
use warnings;
use FOO::BAR::Foobar;
print "try FOO::BAR::Foobar::foo()\n";
FOO::BAR::Foobar::foo(); # perl can't find this
print "try foo()\n";
foo(); # errors out - can't find &main::foo
print "done\n";
./FOO/BAR/Foobar.pl
#!/usr/bin/perl -w
use strict;
use warnings;
package Foobar;
our($VERSION , @ISA , @EXPORT , @EXPORT_OK , %EXPORT_TAGS , $FOO);
BEGIN {
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(foo);
}
sub foo {
print "Loaded\n";
$FOO = q{some val};
}
1;
执行转储
perl Caller.pl
try FOO::BAR::Foobar::foo()
Undefined subroutine &FOO::BAR::Foobar::foo called at Caller.pl line 12.
发生了什么事?我应该放弃使用Exporter 吗?那么如何跨模块链接功能呢?
【问题讨论】:
-
尝试将文件顶部的
package Foobar替换为package FOO::BAR::Foobar./FOO/BAR/Foobar.pl -
值得指出的是,模块文件通常从不运行,所以 shebang 行
#!/usr/bin/perl -w只是一个注释,应该删除。 -
“我在一大段代码上浪费了很多天,其中包含 Exporter 语句,这在大约一年前就可以工作了”关于 Perl 中的错误的东西,这比您的错误可能性要小得多。如果您没有更改“更大的代码块”,它仍然会运行,这是您应该在“很多天”前尝试的第一件事。
-
提示:
.是 CWD,不需要脚本目录。由于您想要脚本的目录,请改用$RealBin(在执行use FindBin qw( $RealBin );之后)。例如use FindBin qw( $RealBin ); use lib $RealBin, "$RealBin/FOO/BAR";