首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >出口符号不出口

出口符号不出口
EN

Stack Overflow用户
提问于 2014-03-10 07:41:33
回答 3查看 122关注 0票数 1

我正在学习如何在Perl中使用包和对象。

有人建议我使用Exporter,以便使用具有package指令的模块的函数和变量。

我很想知道是否有一种不用Exporter就可以导出符号的方法?换句话说,Exporter可以在某种程度上被模仿吗?

我之所以问这个问题,是因为我假设导出程序需要额外的功能开销,而这些小的、简单的脚本必须尽可能快地运行,并且可以通过包含一些简单的代码行来避免这种功能。

也许简单地说明一下我的意思也许会有帮助。

假设我有一个模块只做这个

代码语言:javascript
复制
my $my_string = "my_print";
sub my_print {
  print "$my_string: ", @_;
}

这将允许许多小脚本使用my_print而不是print,只需一个简单的require就可以使用我的模块的文件名(并且开销很小)。

然后,我想在另一个有包声明的模块中使用它,但这不再有效,所以现在我必须在我的简单模块中使用package声明,因此Exporter才能使它在新模块中工作。

在使用Perl很长一段时间之后,我已经习惯了这样一个事实:几乎所有的事情都非常简单、简单和低开销,所以我只是觉得可能会有这样的解决方案。如果不是,那么我会接受一个确切解释为什么出口商是唯一途径的答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-10 18:24:06

出口商做的事情很简单。下面是在不使用出口商的情况下如何做到这一点:

In Foo.pm:

代码语言:javascript
复制
package Foo;

use strict;
use warnings;

sub answer { 42 }

sub import {
  no strict 'refs';
  my $caller = caller;
  *{$caller . "::answer"} = \&answer;
}

1;

In script.pl:

代码语言:javascript
复制
use Foo;

print answer(), "\n";

然而,正如其他人所说,您确实不必担心使用出口商的开销。它是一个相当小而高效的模块,从5.0开始就与每个版本的Perl捆绑在一起。此外,您可能已经将其加载到某个地方了--许多核心Perl模块(如Carp、Scalar::Util、List::Util等)都在使用它。

更新:在上面代码的早期版本中,我忘记了no strict 'refs';。这是*{$some_string}工作所必需的。

票数 2
EN

Stack Overflow用户

发布于 2014-03-10 08:12:16

出口商绝对是低开销的。在另见一节中还有一个可供选择的模块列表。

如果您很好奇,您可以为模块执行一个CPAN检索,并亲自查看来源。您会注意到,大多数“代码”只是文档。但是,老实说,如果您是perl的新手,那么您就不应该担心精简代码的重要性,因为您应该尽可能地利用更多的资源,使编码更快、更容易。

只是我的$.02

票数 0
EN

Stack Overflow用户

发布于 2014-03-10 08:23:23

听起来你是想找个借口来避免Exporter吗?您真的有过启动太慢的程序吗?Exporter只在编译阶段加载和执行。

如果你真的担心编译速度,那么你应该写

代码语言:javascript
复制
BEGIN { require MyPackage }

然后以后

代码语言:javascript
复制
MyPackage::myprint($myparam)

它根本不涉及来自Exporter的开销,甚至不涉及等效的内联代码。

是的,实际上将符号从一个包导出到另一个包的代码只是Exporter.pm代码中的一行代码,您可以复制它。但你不是更愿意补充一下

代码语言:javascript
复制
use MyPackage;

在开始编程时就知道,从任何上下文中,来自MyPackage的符号都将正确地导出?

如果您有“必须尽可能快地运行的小型简单脚本”,那么您应该研究将它们作为守护进程运行,而不是每次运行该程序时重新编译Perl。

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

https://stackoverflow.com/questions/22294568

复制
相关文章

相似问题

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