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

时间:2018-07-05 14:33:32

标签: 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("$foo\n");

执行该脚本会引发导出错误:

  

Foo :: Utilities模块未导出“ dummy_method”
  在/home/me/foo.pl第3行出现导入错误后无法继续
  BEGIN失败-在/home/me/foo.pl第3行中,编译中止。

我很困惑,因为我用@EXPORT = qw(dummy_method);显式导出了该子例程。如何在另一个脚本中使用dummy_method

2 个答案:

答案 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编写了您的代码。这也可以

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("$foo\n");

不再需要使用vars,最好从import 导入 Exporter方法(而不是继承)从Perl v5.8.7起