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

StackOverflow https://stackoverflow.com/questions/1843129

  •  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 модуль, который может справиться со всем этим за вас.Если вы не хотите использовать модуль, просто посмотрите на исходный код, который точно показывает вам, как это сделать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top