我有一些导出各种函数的Perl模块。(我们已经有几年没有在新模块中使用@EXPORT了,但为了与旧脚本兼容,我们保留了它。)
我已经重命名了许多函数和方法,以更改为一致的命名策略,并考虑添加如下所示的行列表
*directory_error = *directoryError;在模块的末尾,只需将旧名称作为新名称的别名。
这是可行的,除非导出旧名称,并且调用脚本调用具有非限定名称的函数:在这种情况下,它报告没有找到该子例程(在调用模块中)。
我猜想正在发生的事情是,导出器在别名尚未创建的时候开始准备列表;但我尝试将typeglob赋值放在BEGIN块中,但没有帮助。
我尝试过自动加载,但这当然不会使该名称在调用上下文中可用。当然,我可以编写一系列的包装器函数,但这太乏味了。我可以自动生成包装器函数,尽管我不确定如何生成。
有没有什么好的建议来处理这个问题呢?
发布于 2009-04-29 13:21:27
下面的方法对我很有效。这似乎就是你所描述的,你一定是在什么地方弄错了。
主脚本:
use strict;
use warnings;
use Bar;
baz();模块:
package Bar;
use strict;
use warnings;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(baz);
sub Baz { print "Baz() here\n" }
*baz = *Baz;
1;发布于 2009-04-29 14:06:51
如果希望这两个名称都可见,则必须导出这两个名称。使用Michael Carman的答案作为基础,您需要
our @EXPORT = qw(Baz baz);或
our @EXPORT = qw(Baz);
our @EXPORT_OK = qw(baz);如果您希望能够调用程序中的任何一个。仅仅因为它们指向相同的coderef并不意味着该coderef的所有名称都将被导出。
https://stackoverflow.com/questions/801949
复制相似问题