未定义的子程序调用

rig*_*old 8 perl perl-module

我试图在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

您从未wordsFlame::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'将按预期工作.

  • 您的帖子已用于重现错误.[见meta](http://meta.stackoverflow.com/q/294342/1903366) (35认同)

Kee*_*yOn 7

你需要做这样的事情

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

  • 您的帖子已用于重现错误.[见meta](http://meta.stackoverflow.com/q/294342/1903366) (34认同)