perl - 无法正确使用 Exporter
问题描述
我已经在包含语句的更大代码块上浪费了很多天Exporter
,这在大约一年前曾经可以工作。这方面的几个变体都失败了,包括一个安装./FOO/BAR/Foobar.pm
成功的信号。
我正在使用为 MSWin32-x64-multi-thread 构建的 Windows 10,Perl v5.26.0
调用者.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
吗?但是如何跨模块链接功能呢?
解决方案
出了三件事:
同
FOO::BAR::Foobar::foo()
:没有sub
,只有Foobar::foo()
。With
foo()
:use FOO::BAR::Foobar;
等效于BEGIN { require FOO::BAR::Foobar; FOO::BAR::Foobar->import() }
,但import
包中没有可用的方法FOO::BAR::Foobar
,因为您继承Exporter
到包Foobar
中。With
foo()
:您使用@EXPORT_OK
而不是@EXPORT
,这意味着您需要显式 importfoo
,但您没有在use FOO::BAR::Foobar;
.
所以需要做两件事来解决这个问题:
正如@HåkonHægland 在评论中已经指出的那样,更改
package Foobar;
为package FOO::BAR::Foobar;
.更改
use FOO::BAR::Foobar;
为use FOO::BAR::Foobar qw/foo/;
。
然后您显示的代码将起作用 - 无需放弃Exporter
。我只是推荐一种不同的使用方式Exporter
:而不是继承 via @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;
推荐阅读
- binary - 图灵机用于二进制数的加法和比较
- python - 如何在 Google Cloud Functions 中正确使用 Python 3 导入
- php - 有没有办法在一个滑块中显示多个图像
- java - 我们如何重新制作程序以打开 xml 文件并在价格字后读取百分比值并将此值从
- python - Python:GPS 点和属性的数据结构和处理
- python - 我可以在熊猫中获得一个额外的标题作为所有列顶部的名称吗
- typescript - 函数的条件泛型类型被分解为类型片段
- jquery - 在 Jquery 中将 DateTime 数据转换为 MM/DD/YYYY
- java - CWE-681:在 Java 中的不兼容突变期间避免数值数据损坏
- java - 如何调出 Android 中活动后台堆栈中存在的活动?