Назначение Typeglob
*ExistingClass::oldExistingFunction = *ExistingClass::existingFunction;
Быстро и грязно. Это объединяет все символы existingFunction
в oldExistingFunction
. Это включает интересующую вас подпрограмму, а также любые скаляры, массивы, хэши, дескрипторы, которые могут иметь одно и то же имя.
- Преимущества: не думая, это просто работает. "Быстрый"
- Недостатки: "грязный"
Кодовое задание
*ExistingClass::oldExistingFunction = \&ExistingClass::existingFunction;
# or something using *ExistingClass::symbol{CODE}
Этот псевдоним только псевдоним. Это все еще делается в пакете, поэтому символ oldExistingFunction
виден глобально, что может быть, а может и не быть тем, что вы хотите. Вероятно, нет.
- Преимущества: псевдонимы не «просачиваются» в другие типы переменных.
- Недостатки: больше мышления, больше печатания. Намного больше размышлений, если использовать синтаксис * ... {CODE} (лично я не использую его каждый день)
Лексическая кодовая ссылка
my $oldFunction = \&ExistingClass::existingFunction;
Использование my
сохраняет ссылку на старую функцию, которая видна только текущему блоку / файлу. Для внешнего кода больше нет возможности получить его без вашей помощи. Имейте в виду соглашение о вызовах:
$self->$oldFunction(@args);
$oldFunction->($self, @args);
- Преимущества: больше нет проблем с видимостью
- Недостатки: сложнее понять
Муз
См. ответ jrockway . Должно быть, это правильный путь, так как больше нет никаких шуток с шариками и / или ссылками, но я не знаю этого достаточно, чтобы объяснить это.