Perl Can';我不能正确使用出口商
我已经在一个更大的代码块上浪费了很多天,其中包含Perl Can';我不能正确使用出口商,perl,exporter,Perl,Exporter,我已经在一个更大的代码块上浪费了很多天,其中包含Exporter语句,大约在一年前就可以使用了。这方面的几个变体都失败了,包括安装了表示成功的/FOO/BAR/Foobar.pm 我使用的是Windows10,PerlV5.26.0,它是为MSWin32-x64多线程构建的 Caller.pl #/usr/bin/perl 使用lib“.”; 使用lib“/FOO/BAR”; 严格使用; 使用警告; 使用FOO::BAR::Foobar; 打印“try FOO::BAR::Foobar::FOO
Exporter
语句,大约在一年前就可以使用了。这方面的几个变体都失败了,包括安装了表示成功的/FOO/BAR/Foobar.pm
我使用的是Windows10,PerlV5.26.0,它是为MSWin32-x64多线程构建的
Caller.pl
#/usr/bin/perl
使用lib“.”;
使用lib“/FOO/BAR”;
严格使用;
使用警告;
使用FOO::BAR::Foobar;
打印“try FOO::BAR::Foobar::FOO()\n”;
FOO::BAR::Foobar::FOO();#perl找不到这个
打印“try foo()\n”;
foo();#出错-找不到&main::foo
打印“完成”\n;
/FOO/BAR/Foobar.pl
#/usr/bin/perl-w
严格使用;
使用警告;
包装Foobar;
我们的($VERSION,@ISA,@EXPORT,@EXPORT\u OK,%EXPORT\u TAGS,$FOO);
开始{
要求出口商;
@ISA=qw(出口商);
@出口_OK=qw(foo);
}
sub-foo{
打印“已加载\n”;
$FOO=q{some val};
}
1.
执行转储
perl Caller.pl
试试FOO::BAR::Foobar::FOO()
在Caller.pl第12行调用了未定义的子例程&FOO::BAR::Foobar::FOO。
发生什么事了?我应该放弃使用导出器吗?但是如何跨模块链接功能呢?有三件事出了问题:
FOO::BAR::Foobar::FOO()
:没有这样的子项
,只有Foobar::FOO()
foo()
:使用foo::BAR::Foobar
相当于BEGIN{require FOO::BAR::Foobar;FOO::BAR::Foobar->import()}
,但是在包FOO::BAR::Foobar
中没有方法import
,因为您将Exporter
继承到包Foobar
中foo()
:您正在使用@EXPORT\u OK
而不是@EXPORT
,这意味着您需要显式导入foo
,但在使用foo::BAR::Foobar中没有这样做代码>
包装Foobar代码>到包FOO::BAR::Foobar代码>
使用FOO::BAR::Foobar代码>使用FOO::BAR::Foobar qw/FOO/代码>
Exporter
:不要通过@ISA
继承,只需将import
导入到您的包中即可。下面是我将如何编写您的文件/FOO/BAR/Foobar.pm
:
package FOO::BAR::Foobar;
use strict;
use warnings;
use Exporter 'import';
our @EXPORT_OK = qw(foo);
our $FOO;
sub foo {
print "Loaded\n";
$FOO = q{some val};
}
1;
有三件事出了问题:
FOO::BAR::Foobar::FOO()
:没有这样的子项
,只有Foobar::FOO()
foo()
:使用foo::BAR::Foobar
相当于BEGIN{require FOO::BAR::Foobar;FOO::BAR::Foobar->import()}
,但是在包FOO::BAR::Foobar
中没有方法import
,因为您将Exporter
继承到包Foobar
中foo()
:您正在使用@EXPORT\u OK
而不是@EXPORT
,这意味着您需要显式导入foo
,但在使用foo::BAR::Foobar中没有这样做代码>
包装Foobar代码>到包FOO::BAR::Foobar代码>
使用FOO::BAR::Foobar代码>使用FOO::BAR::Foobar qw/FOO/代码>
Exporter
:不要通过@ISA
继承,只需将import
导入到您的包中即可。下面是我将如何编写您的文件/FOO/BAR/Foobar.pm
:
package FOO::BAR::Foobar;
use strict;
use warnings;
use Exporter 'import';
our @EXPORT_OK = qw(foo);
our $FOO;
sub foo {
print "Loaded\n";
$FOO = q{some val};
}
1;
尝试在文件
/FOO/BAR/Foobar.pl
的顶部用package FOO::BAR::Foobar
替换package Foobar
。值得指出的是,模块文件通常不会运行,因此shebang行#/usr/bin/perl-w
只是一个注释,应该删除。“我在一个更大的代码块上浪费了很多天,其中包含导出器语句,大约在一年前就可以使用了。”试图将这些东西归咎于perl中的一个bug并不是很合适,这比您犯错误的可能性要小得多。如果您没有更改“较大的代码块”,它仍然会运行,这是您应该在“许多天”之前尝试的第一件事情之一。提示:
是CWD,而不是脚本的目录。由于您需要脚本的目录,请改用$RealBin
(在执行之后使用FindBin qw($RealBin);
)。e、 g.使用FindBin qw($RealBin);使用lib$RealBin“$RealBin/FOO/BAR”
尝试将package Foobar
替换为package FOO::BAR::Foobar
文件/FOO/BAR/Foobar.pl
值得指出的是,模块文件通常不会运行,因此shebang行#/usr/bin/perl-w
只是一个注释,应该删除。“我在一个更大的代码块上浪费了很多天,其中包含导出器语句,大约在一年前就可以使用了。”试图将这些东西归咎于perl中的一个bug并不是很合适,这比您犯错误的可能性要小得多。如果您没有更改“较大的代码块”,它仍然会运行,这是您应该在“许多天”之前尝试的第一件事情之一。提示:
是CWD,而不是脚本的目录。由于您需要脚本的目录,请改用$RealBin
(在执行之后使用FindBin qw($RealBin);
)。e、 g.使用FindBin qw($RealBin);使用lib$RealBin“$RealBin/FOO/BAR”代码>1。和