这是我想要实现的目标:
sub first {
print "this is original first";
}
*original_first = \&first;
sub first {
print "this is first redefined";
}
original_first(); # i expect this to print "this is original first"
first() # i expect this to print "this is first redefined"
我认为通过保存first
的符号,我以后可以调用原始子例程(名称为original_first
)并且也可以调用first
,并重新定义一个。但是,如果我调用original_first
,我仍然会得到“这是第一次重新定义”。我需要做些什么来完成这项工作?
答案 0 :(得分:9)
这应该按照您的预期运作:
sub first {
print "this is original first";
}
*original_first = \&first;
*first = sub {
print "this is first redefined";
};
答案 1 :(得分:9)
在你的代码中,Perl解释了与此类似的两个子声明:
BEGIN {
*first = sub { ... }
}
所以在保存副本和调用例程之前,&first
的两个赋值都会结束。修复是将第二个声明变为运行时赋值:
sub first {
print "this is original first";
}
*original_first = \&first;
*first = sub {print "this is first redefined"};
original_first(); # prints "this is original first"
first(); # prints "this is first redefined"
答案 2 :(得分:1)
请参阅Hook::LexWrap模块,该模块可以为您处理所有这些问题。如果您不想使用该模块,只需查看源代码,它会向您显示如何执行该操作。