我怎样才能重新定义一个子程序并保留旧程序呢?

时间:2009-12-03 21:44:32

标签: perl symbols redefinition

这是我想要实现的目标:

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,我仍然会得到“这是第一次重新定义”。我需要做些什么来完成这项工作?

3 个答案:

答案 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模块,该模块可以为您处理所有这些问题。如果您不想使用该模块,只需查看源代码,它会向您显示如何执行该操作。