我有一个名为Utilities.pm
的模块。 它导出一个名为dummy_method
的子例程。
package Foo::Utilities;
use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(dummy_method);
sub dummy_method {
# do things
}
我有一个使用dummy_method
子例程的 Perl 脚本:
use strict;
use warnings;
use Foo::Utilities qw('dummy_method');
my $foo = Foo::Utilities::dummy_method("foo");
print("$foon");
执行该脚本会引发导出错误:
"dummy_method"未由 Foo::实用程序模块
导出 导入错误后无法继续/home/me/foo.pl第 3 行 BEGIN 失败 - 编译在/home/me/foo.pl第 3
行中止。
我很困惑,因为我使用@EXPORT = qw(dummy_method);
显式导出该子例程。 如何在另一个脚本中使用dummy_method
?
有些人痴迷于使用 qw 作为导入列表,即使只有一个元素。 我认为这让其他人认为这是一个要求,而这只是列出清单的一种方式。
use Foo::Utilities qw('dummy_method');
说导入一个叫'dummy_method'
的方法,而不是dummy_method
,就像print qw('dummy_method')
打印'dummy_method'
,而不是dummy_method
一样。
请尝试:
use Foo::Utilities 'dummy_method';
或者,如果您必须:
use Foo::Utilities qw(dummy_method);
虽然由于您默认导出它,您可以只做:
use Foo::Utilities;
或者,由于您将其称为 Foo::Utilities::d ummy_method,因此默认情况下甚至不导出它:
use Foo::Utilities ();
您编写的代码经过ysth建议的修改后工作正常。我能想到的唯一可能性是您错误地命名或定位了您的模块
use Foo::Utilities 'dummy_method'
将加载一个名为Foo/Utilities.pm
的文件,其中Foo
目录位于@INC
的某个路径中。省略模块路径中必须包含的初始目录是一个常见的错误,并且您确实说您的模块仅被调用Utilities.pm
还必须有一个行为不同的Foo/Utilities.pm
,否则use
语句甚至无法找到文件
我已经用更现代的Perl编写了你的代码。这也行得通
Foo/Utilities.pm
package Foo::Utilities;
use strict;
use warnings 'all';
use Exporter 'import';
our @EXPORT = qw(dummy_method);
sub dummy_method {
print "dummy_method()n";
'do things';
}
main.pl
use strict;
use warnings;
use Foo::Utilities 'dummy_method';
my $foo = dummy_method('foo');
print("$foon");
不再需要使用vars
,从 Perl v5.8.7 开始,最好从Exporter
导入import
方法(而不是继承它(