我正在学习如何在Perl中使用包和对象。
有人建议我使用Exporter,以便使用具有package指令的模块的函数和变量。
我很想知道是否有一种不用Exporter就可以导出符号的方法?换句话说,Exporter可以在某种程度上被模仿吗?
我之所以问这个问题,是因为我假设导出程序需要额外的功能开销,而这些小的、简单的脚本必须尽可能快地运行,并且可以通过包含一些简单的代码行来避免这种功能。
也许简单地说明一下我的意思也许会有帮助。
假设我有一个模块只做这个
my $my_string = "my_print";
sub my_print {
print "$my_string: ", @_;
}这将允许许多小脚本使用my_print而不是print,只需一个简单的require就可以使用我的模块的文件名(并且开销很小)。
然后,我想在另一个有包声明的模块中使用它,但这不再有效,所以现在我必须在我的简单模块中使用package声明,因此Exporter才能使它在新模块中工作。
在使用Perl很长一段时间之后,我已经习惯了这样一个事实:几乎所有的事情都非常简单、简单和低开销,所以我只是觉得可能会有这样的解决方案。如果不是,那么我会接受一个确切解释为什么出口商是唯一途径的答案。
发布于 2014-03-10 18:24:06
出口商做的事情很简单。下面是在不使用出口商的情况下如何做到这一点:
In Foo.pm:
package Foo;
use strict;
use warnings;
sub answer { 42 }
sub import {
no strict 'refs';
my $caller = caller;
*{$caller . "::answer"} = \&answer;
}
1;In script.pl:
use Foo;
print answer(), "\n";然而,正如其他人所说,您确实不必担心使用出口商的开销。它是一个相当小而高效的模块,从5.0开始就与每个版本的Perl捆绑在一起。此外,您可能已经将其加载到某个地方了--许多核心Perl模块(如Carp、Scalar::Util、List::Util等)都在使用它。
更新:在上面代码的早期版本中,我忘记了no strict 'refs';。这是*{$some_string}工作所必需的。
发布于 2014-03-10 08:12:16
出口商绝对是低开销的。在另见一节中还有一个可供选择的模块列表。
如果您很好奇,您可以为模块执行一个CPAN检索,并亲自查看来源。您会注意到,大多数“代码”只是文档。但是,老实说,如果您是perl的新手,那么您就不应该担心精简代码的重要性,因为您应该尽可能地利用更多的资源,使编码更快、更容易。
只是我的$.02
发布于 2014-03-10 08:23:23
听起来你是想找个借口来避免Exporter吗?您真的有过启动太慢的程序吗?Exporter只在编译阶段加载和执行。
如果你真的担心编译速度,那么你应该写
BEGIN { require MyPackage }然后以后
MyPackage::myprint($myparam)它根本不涉及来自Exporter的开销,甚至不涉及等效的内联代码。
是的,实际上将符号从一个包导出到另一个包的代码只是Exporter.pm代码中的一行代码,您可以复制它。但你不是更愿意补充一下
use MyPackage;在开始编程时就知道,从任何上下文中,来自MyPackage的符号都将正确地导出?
如果您有“必须尽可能快地运行的小型简单脚本”,那么您应该研究将它们作为守护进程运行,而不是每次运行该程序时重新编译Perl。
https://stackoverflow.com/questions/22294568
复制相似问题