Perl 调用未定义的子例程
我正在尝试用Perl进行简单的模块使用: Flame/Text.pm: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
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'
将按预期工作。您的帖子已被用于重现错误。您的帖子已被用于复制错误。