Как я мог переопределить подпрограмму и сохранить старую также?

Я думаю, что Вы спрашиваете о REPL (Чтение, Оцените, Печать, Цикл), интерфейс к жемчугу. Существует несколько способов сделать это:

  • Matt Trout имеет статья , которая описывает, как записать один
  • , Adriano Ferreira описал некоторые опции
  • и наконец, можно скачкообразно двинуться на IRC по irc.perl.org и испытать одного из ботов оценки во многих популярных каналах. Они оценят блоки жемчуга, который Вы передаете им.

7
задан Rook 3 December 2009 в 21:56
поделиться

3 ответа

Это должно работать так, как вы ожидаете:

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

*original_first = \&first;

*first = sub {
    print "this is first redefined";
};
9
ответ дан 6 December 2019 в 10:00
поделиться

См. Модуль Hook :: LexWrap , который может справиться со всем этим за вас. Если вы не хотите использовать модуль, просто посмотрите исходный код, который показывает вам, как именно это сделать.

1
ответ дан 6 December 2019 в 10:00
поделиться

в вашем коде, 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"
9
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: