我正在尝试在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;
答案 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