Perl如何重定义my_pck包中my_today sub并访问旧实现避免递归报错
Perl my_today方法重定义递归问题解决方案
错误原因
- 深递归:你新定义的
my_today直接覆盖了my_pck包中原有的同名方法,调用my_pck::my_today()实际是调用新写的函数本身,形成无限递归最终触发内存溢出。 - 重定义警告:Perl默认会对同包内同名子程序的重复定义输出警告信息。
- 代码笔误:你给出的重定义示例中,计算得到
$date后返回的是未定义的$day变量,运行时也会报错。
解决方案
你仅需要在# ... some extra的位置插入以下代码即可,无需修改其他任何逻辑:
# 备份原始my_today子程序的引用 my $original_my_today = \&my_today; # 临时关闭重定义警告,覆盖原有方法 no warnings 'redefine'; *my_today = sub { # 调用原始方法获取当日日期 my $date = $original_my_today->(); # 调用日期计算方法减去一天,需确保my_datefunc已提前加载可用 $date = my_datefunc($date, "-", 1); return $date; }; # 恢复重定义警告 use warnings 'redefine';
方案说明
- 这段代码运行在
BEGIN块的my_pck包作用域下,直接操作包符号表替换子程序,所有后续调用my_today的地方都会自动使用重写后的逻辑,无需修改原有调用代码。 - 提前备份原始方法的引用,重写逻辑中调用备份引用不会触发递归。
- 临时关闭
redefine警告,避免输出重定义提示。 - 修正了原示例中的变量名错误,确保返回值正确。
内容的提问来源于stack exchange,提问作者Andy A.
相关产品推荐
相关产品推荐

