首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未定义子程序调用

未定义子程序调用
EN

Stack Overflow用户
提问于 2014-02-04 19:09:11
回答 2查看 31.4K关注 0票数 11

我试图在Perl中进行简单的模块使用:

火焰/下午:

代码语言:javascript
运行
复制
package Flame::Text;
sub words { … }
1;

火焰/问答下午:

代码语言:javascript
运行
复制
package Flame::Query;
use Flame::Text qw(words);
sub parse_query { words(shift); }
parse_query 'hi';
1;

为什么我会收到以下错误消息?

未定义的子例程&Flame::Query::words在Flame/Query.pm第3行调用。

以下功能很好:

代码语言:javascript
运行
复制
package Flame::Query;
use Flame::Text;
sub parse_query { Flame::Text::words(shift); }
parse_query 'hi';
1;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-04 19:22:11

您从未从words包导入或导出Flame::Text子例程。语句use Some::Module @args等效于:

代码语言:javascript
运行
复制
BEGIN {
  require Some::Module;
  Some::Module->import(@args);
}

也就是说,使用指定的参数调用import方法。此方法通常会将各种符号从一个包导出到调用包中。

不要编写自己的import,而是可以从Exporter模块继承一个。此模块是通过在@EXPORT_OK全局变量中存储可导出符号来配置的。所以你的代码会变成:

代码语言:javascript
运行
复制
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'将如预期的那样工作。

票数 13
EN

Stack Overflow用户

发布于 2014-02-04 19:21:24

你需要这样做

代码语言:javascript
运行
复制
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

别忘了

代码语言:javascript
运行
复制
use strict; use warnings;

在所有事情上,perl

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21561226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档