PERL: БИБЛИОТЕКА ПРОГРАММИСТА



              

PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 354


> Смотри также---------------------------------------------------------------------------------------------

Описание замыканий в perlref(l); раздел «Symbol tables» perlmod(l); ре­цепты 10.11; 11.4.

10.15. Перехват вызовов неопределенных функций с помощью AUTOLOAD

Проблема

Требуется перехватить вызовы неопределенных функций и достойно обрабо­тать их.

Решение

Объявите функцию с именем AUTOLOAD для пакета, вызовы неопределенных функ­ций которого вы собираетесь перехватывать. Во время ее выполнения пере­менная $AUTOLOAD этого пакета содержит имя вызванной неопределенной функ­ции.

Комментарий

В подобных ситуациях обычно применяются вспомогательные функции (proxy). При вызове неопределенной функции вместо автоматического инициирования исключения также можно перехватить вызов. Если пакет, к которому принадле­жит вызываемая функция, содержит функцию с именем AUTOLOAD, то она будет вызвана вместо неопределенной функции, а специальной глобальной переменной пакета $AUTOLOAD будет присвоено полное имя функции. Затем функция AUTOLOAD сможет делать все, что должна была делать исходная функция.

sub AUTOLOAD  {

use vars qw($AUTOLOAD);

my $color = SAUTOLOAD;

$color =~ s/.¦:://;

return  "<FONT COLOR='$color'xa_</FONT>"; }

# Примечание:  функция sub chartreuse не определена print  chartreuse("stuff');

При вызове несуществующей функции main: : chartreuse вместо инициирова­ния исключения будет вызвана функция main: :AUTOLOAD с аргументами, пере­данными chartreuse. Пакетная переменная $AUTOLOAD будет содержать строку

main: :chartreuse.


372   Глава 10 • Подпрограммы

Методика с присваиваниями тип-глобов из рецепта 10.14 быстрее и удобнее. Быстрее — поскольку вам не приходится запускать копию и заниматься подста­новками. Удобнее — поскольку вы сможете делать следующее:

{

local «yellow = \&violet;

local  (*red,   *green)  =  (\&green,   \&red);

pnnt_stuff (); }

При работе pnnt_stuff или любой вызванной ей функции все, что должно вы­водиться желтым цветом, выводится фиолетовым; красный цвет заменяется зеле­ным, и наоборот.




Содержание  Назад  Вперед