等同2个子程序的最佳方法是什么?

时间:2013-08-02 04:55:52

标签: perl

我有很多模块,每个模块都有子insert_info和子update_info方法。子update_info和子insert_info有时是相同的。但是当我发生这种情况时,我不想只使用其中一种方法,因为通常它们不一样。那么我如何使两种方法相等?

这是唯一的方法吗?

 sub insert_info {
 # code......
 }

 sub update_info { insert_info(); }

3 个答案:

答案 0 :(得分:4)

通过typeglob

的别名
*update_info = \&insert_info;

添加BEGIN可以避免出现问题

BEGIN { *update_info = \&insert_info; }

这有助于确保它在其他事物之前运行,这可能会调用它。


对您的示例的评论

此外,您的sub update_info { insert_info(); }不是副本,因为它始终会在没有参数的情况下调用 insert_info 。如果您传递了 update_info 任何值(例如update_info('someval')),则不会将它们传递给 insert_info 。此外,它们都是声明和定义的子程序 - 都记忆。

如果您想要声明它是如何做的并自动将参数传递给内部函数,那么您可以sub update_info { insert_info(@_); },或者更好sub update_info { &insert_info },因为&没有任何参数参数列表将自动传递@_

仍然比使用顶部列出的 typeglob 分配占用更多内存。

答案 1 :(得分:2)

这是使用goto而不被羞辱的难得机会之一。

sub update_info {
    goto &insert_info;
}

这样可以将任何参数传递给内部函数,并清理caller()堆栈以删除对外部函数的调用。

答案 2 :(得分:0)

我建议你使用CPAN的Sub::Alias模块,它具有显式和自我记录的优点,并且使用简洁明了。

您的代码变为

use Sub::Alias 'alias';

sub insert_info {
  ...
}

alias update_info => 'insert_info';