我有很多模块,每个模块都有一个 subinsert_info
和 subupdate_info
方法。有时,子update_info
和子insert_info
是相同的。但是当发生这种情况时,我不想只使用其中一种方法,因为总的来说它们是不一样的。那么我如何使这两种方法相等呢?
这是唯一的方法吗?
sub insert_info {
# code......
}
sub update_info { insert_info(); }
我有很多模块,每个模块都有一个 subinsert_info
和 subupdate_info
方法。有时,子update_info
和子insert_info
是相同的。但是当发生这种情况时,我不想只使用其中一种方法,因为总的来说它们是不一样的。那么我如何使这两种方法相等呢?
这是唯一的方法吗?
sub insert_info {
# code......
}
sub update_info { insert_info(); }
*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分配占用更多的内存。
这是难得的使用机会之一,goto
而不会为此感到羞耻。
sub update_info {
goto &insert_info;
}
这样做的好处是将任何参数传递给内部函数,并清理caller()
堆栈以删除对外部函数的调用。
我建议你使用Sub::Alias
来自 CPAN 的模块,它具有显式和自文档化以及使用起来简洁明了的优点。
你的代码变成
use Sub::Alias 'alias';
sub insert_info {
...
}
alias update_info => 'insert_info';