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

Geo*_*Geo 7 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"
Run Code Online (Sandbox Code Playgroud)

我认为通过保存符号first,我可以稍后调用原始子程序(在名称下original_first)并且也能够调用first,并重新定义一个.但是,如果我打电话给original_first,我仍然得到"这是第一次重新定义".我需要做些什么来完成这项工作?

Luk*_*ský 9

这应该按预期工作:

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

*original_first = \&first;

*first = sub {
    print "this is first redefined";
};
Run Code Online (Sandbox Code Playgroud)

  • 将coderef(由sub {...}生成)赋值给typeglob只会替换glob中的CODE条目.glob中的任何其他数据类型都不会更改 (5认同)
  • 您也可以使用`local*first = sub {...};`来替换特定块中的函数. (4认同)

Eri*_*rom 9

在你的代码中,Perl解释了与此类似的两个子声明:

BEGIN {
    *first = sub { ... }
}
Run Code Online (Sandbox Code Playgroud)

因此&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"
Run Code Online (Sandbox Code Playgroud)