2

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

这是唯一的方法吗?

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

 sub update_info { insert_info(); }
4

3 回答 3

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分配占用更多的内存。

于 2013-08-02T04:59:36.587 回答
2

这是难得的使用机会之一,goto而不会为此感到羞耻。

sub update_info {
    goto &insert_info;
}

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

于 2013-08-02T14:02:47.497 回答
0

我建议你使用Sub::Alias来自 CPAN 的模块,它具有显式和自文档化以及使用起来简洁明了的优点。

你的代码变成

use Sub::Alias 'alias';

sub insert_info {
  ...
}

alias update_info => 'insert_info';
于 2013-08-03T03:02:57.903 回答