Как я мог переопределить подпрограмму и сохранить старую? - PullRequest
7 голосов
/ 04 декабря 2009

Вот чего я хотел бы достичь:

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, я все равно получаю «это сначала переопределено». Что я должен сделать, чтобы сделать эту работу?

Ответы [ 3 ]

9 голосов
/ 04 декабря 2009

в вашем коде, 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 голосов
/ 04 декабря 2009

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

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

*original_first = \&first;

*first = sub {
    print "this is first redefined";
};
1 голос
/ 04 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...