我有一个名为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("$foo\n");
执行该脚本会引发导出错误:
Foo :: Utilities模块未导出“ dummy_method”
在/home/me/foo.pl第3行出现导入错误后无法继续
BEGIN失败-在/home/me/foo.pl第3行中,编译中止。
我很困惑,因为我用@EXPORT = qw(dummy_method);
显式导出了该子例程。如何在另一个脚本中使用dummy_method
?
答案 0 :(得分:7)
即使只有一个元素,也有些人迷恋使用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 :: dummy_method,因此默认情况下甚至不会将其导出:
use Foo::Utilities ();
答案 1 :(得分:3)
您编写的代码经过 ysth 建议的修改,可以正常工作。我能想到的唯一剩下的可能性是您对模块的命名或位置不正确
use Foo::Utilities 'dummy_method'
将加载一个名为Foo/Utilities.pm
的文件,其中Foo
目录位于@INC
中的路径之一中。忽略必须在模块路径中的初始目录是一个常见错误,您确实说您的模块仅被称为Utilities.pm
还必须有一个Foo/Utilities.pm
的行为不同,否则use
语句甚至会找不到文件
我已经用更现代的Perl编写了您的代码。这也可以
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';
}
use strict;
use warnings;
use Foo::Utilities 'dummy_method';
my $foo = dummy_method('foo');
print("$foo\n");
不再需要使用vars
,最好从import
导入 Exporter
方法(而不是继承)从Perl v5.8.7起