Я думаю, что Вы спрашиваете о REPL (Чтение, Оцените, Печать, Цикл), интерфейс к жемчугу. Существует несколько способов сделать это:
Это должно работать так, как вы ожидаете:
sub first {
print "this is original first";
}
*original_first = \&first;
*first = sub {
print "this is first redefined";
};
См. Модуль Hook :: LexWrap , который может справиться со всем этим за вас. Если вы не хотите использовать модуль, просто посмотрите исходный код, который показывает вам, как именно это сделать.
в вашем коде, 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"