Perl 调用未定义的子例程

Perl 调用未定义的子例程,perl,perl-module,Perl,Perl Module,我正在尝试用Perl进行简单的模块使用: Flame/Text.pm: package Flame::Text; sub words { … } 1; Flame/Query.pm: package Flame::Query; use Flame::Text qw(words); sub parse_query { words(shift); } parse_query 'hi'; 1; 为什么我会收到以下错误消息 在Flame/Query.pm第3行调用未定义的子例程&Flame::Que

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

Flame/Text.pm:

package Flame::Text;
sub words { … }
1;
Flame/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;

你需要这样做

package Flame::Text;
use Exporter 'import'; # gives you Exporter's import() method directly
@EXPORT_OK = qw(words);  # symbols to export on request
默认情况下,perl不会导出(或污染)名称空间

别忘了

use strict; use warnings;

在所有perl方面,您从未从
Flame::Text
包导入或导出
words
子例程。语句
use Some::Module@args
相当于:

BEGIN {
  require Some::Module;
  Some::Module->import(@args);
}
也就是说,使用指定的参数调用
import
方法。此方法通常将各种符号从一个包导出到调用包中

不要编写自己的
导入
,您可以从
导出器
模块继承一个。此模块通过将可导出符号存储在
@EXPORT\u 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'
将按预期工作。

您的帖子已被用于重现错误。您的帖子已被用于复制错误。