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



              

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


Прототип функции Perl представляет собой ноль и более пробелов, обратных косых черт или символов типа, заключенных в круглые скобки после определе­ния или имени подпрограммы. Символ типа с префиксом \ означает, что аргу­мент в данной позиции передается по ссылке и должен начинаться с указанного символа типа.

Прототип принудительно задает контекст аргументов, используемых при вы­зове данной функции. Это происходит во время компиляции программы и в большинстве случаев вовсе не означает, что Perl проверяет количество или тип аргументов функции. Если Perl встретит вызов func(3, 5) для функции с прото-


10.11. Прототипы функций   363

типом sub func($), он завершит компиляцию с ошибкой. Но если для того же прототипа встретится вызов func(@array), компилятор всего лишь преобразует @аггау в скалярный контекст; он не скажет: «Массив передавать нельзя — здесь должна быть скалярная величина».

Это настолько важно, что я повторю снова: не пользуйтесь прототипами Perl, если вы надеетесь, что компилятор будет проверять тип и количество аргументов.

Тогда зачем нужны прототипы? Существуют два основных применения, хотя во время экспериментов вы можете найти и другие. Во-первых, с помощью про­тотипа можно сообщить Perl количество аргументов вашей функции, чтобы опус­тить круглые скобки при ее вызове. Во-вторых, с помощью прототипов можно со­здавать подпрограммы с тем же синтаксисом вызова, что и у встроенных функций.

Пропуск скобок

Обычно функция получает список аргументов, и при вызове скобки ставить не

обязательно:

©results = myfunc 3  ,   5;

Без прототипа такая запись эквивалентна следующей:

^results = myfunc(3  ,   5);

При отсутствии скобок Perl преобразует правую часть вызова подпрограммы в списковый контекст. Прототип позволяет изменить такое поведение:

sub myfunc($);

©results = myfunc 3  ,   5;

Теперь эта запись эквивалентна следующей:

@results = ( myfunc(3),   5 );

Кроме того, можно предоставить пустой прототип, показывающий, что функ­ция вызывается без аргументов, как встроенная функция time. Именно так реали­зованы константы LOCK_SH, LOCK_EX и LOCK_UN в модуле Fcntl. Они представляют собой экспортируемые функции, определенные с пустым прототипом:




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