我试图在Perl中使用简单的模块:
火焰/ Text.pm:
package Flame::Text;
sub words { … }
1;
Run Code Online (Sandbox Code Playgroud)
火焰/ Query.pm:
package Flame::Query;
use Flame::Text qw(words);
sub parse_query { words(shift); }
parse_query 'hi';
1;
Run Code Online (Sandbox Code Playgroud)
为什么我收到以下错误消息?
&Flame::Query::words在Flame/Query.pm第3行调用的未定义子例程.
以下工作正常:
package Flame::Query;
use Flame::Text;
sub parse_query { Flame::Text::words(shift); }
parse_query 'hi';
1;
Run Code Online (Sandbox Code Playgroud)
amo*_*mon 11
您从未words从Flame::Text包中导入或导出子例程.声明use Some::Module @args等同于:
BEGIN {
require Some::Module;
Some::Module->import(@args);
}
Run Code Online (Sandbox Code Playgroud)
也就是说,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 { ... }
Run Code Online (Sandbox Code Playgroud)
现在,use Flame::Text 'words'将按预期工作.
你需要做这样的事情
package Flame::Text;
use Exporter 'import'; # gives you Exporter's import() method directly
@EXPORT_OK = qw(words); # symbols to export on request
Run Code Online (Sandbox Code Playgroud)
因为perl默认情况下不会导出(或污染)命名空间
http://perldoc.perl.org/Exporter.html
别忘了
use strict; use warnings;
Run Code Online (Sandbox Code Playgroud)
在所有事情perl