我有很多模块,每个模块都有子insert_info
和子update_info
方法。子update_info
和子insert_info
有时是相同的。但是当我发生这种情况时,我不想只使用其中一种方法,因为通常它们不一样。那么我如何使两种方法相等?
这是唯一的方法吗?
sub insert_info {
# code......
}
sub update_info { insert_info(); }
答案 0 :(得分:4)
*update_info = \&insert_info;
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';