7

这是我想要实现的目标:

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,我仍然会得到“这是第一次重新定义”。我该怎么做才能完成这项工作?

4

3 回答 3

9

这应该可以按您的预期工作:

sub first {
    print "this is original first";
}

*original_first = \&first;

*first = sub {
    print "this is first redefined";
};
于 2009-12-03T21:49:53.913 回答
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"
于 2009-12-03T22:07:07.810 回答
1

请参阅Hook::LexWrap模块,它可以为您处理所有这些。如果您不想使用该模块,只需查看源代码,它会告诉您确切的操作方法。

于 2009-12-04T00:19:33.697 回答