Как я мог бы переопределить подпрограмму и сохранить старую тоже?
-
12-09-2019 - |
Вопрос
Вот чего я хотел бы достичь:
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
, Я все еще получаю сообщение "это сначала переопределено".Что я должен сделать, чтобы это сработало?
Решение
Это должно сработать так, как вы ожидаете:
sub first {
print "this is original first";
}
*original_first = \&first;
*first = sub {
print "this is first redefined";
};
Другие советы
в вашем коде 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"
Смотрите на Крючок::LexWrap модуль, который может справиться со всем этим за вас.Если вы не хотите использовать модуль, просто посмотрите на исходный код, который точно показывает вам, как это сделать.