在 Perl 中找不到导出的子例程



我有一个名为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方法(而不是继承它(

最新更新