未定义的子程序调用

时间:2014-02-04 19:09:12

标签: perl perl-module

我正在尝试在Perl中使用简单的模块:

火焰/ Text.pm:

package Flame::Text;
sub words { … }
1;

火焰/ Query.pm:

package Flame::Query;
use Flame::Text qw(words);
sub parse_query { words(shift); }
parse_query 'hi';
1;

为什么我收到以下错误消息?

  

在Flame / Query.pm第3行调用未定义的子例程&Flame::Query::words

以下工作正常:

package Flame::Query;
use Flame::Text;
sub parse_query { Flame::Text::words(shift); }
parse_query 'hi';
1;

2 个答案:

答案 0 :(得分:11)

您从未导入或导出words包中的Flame::Text子例程。声明use Some::Module @args等同于:

BEGIN {
  require Some::Module;
  Some::Module->import(@args);
}

即,使用指定的参数调用import方法。此方法通常会将各个符号从一个包导出到调用包中。

不要编写自己的import,而是可以从Exporter模块继承一个。通过在@EXPORT_OK全局变量中存储可导出符号来配置此模块。所以你的代码将成为:

package Flame::Text;
use parent 'Exporter';  # inherit from Exporter
our @EXPORT_OK = qw/words/;  # list all subs which you want to export upon request

sub words { ... }

现在,use Flame::Text 'words'将按预期工作。

答案 1 :(得分:7)

你需要做这样的事情

package Flame::Text;
use Exporter 'import'; # gives you Exporter's import() method directly
@EXPORT_OK = qw(words);  # symbols to export on request

因为perl默认情况下不会导出(或污染)命名空间

http://perldoc.perl.org/Exporter.html

别忘了

use strict; use warnings;

所有事情perl