Что такое функция sub в perl и как ее использовать

Функция sub используется для определения подпрограмм в коде perl-программы.

Именованные объявления

Именованные определения

Неименованные определения

Т.е. функция sub принимает в качестве параметров значения NAME PROTO ATTRS BLOCK - все они не являются обязательными. Главное условие: должен быть задан хотя бы один параметр - NAME или BLOCK.

 

Параметр NAME - задает имя подпрограммы

Если указан только параметр NAME, конструкция будет считаться предварительным объявлением имени подпрограммы, и в дальнейшем нужно будет определить саму подпрограмму.

Пример:

Если NAME задана вместе с BLOCK, то конструкция будет считаться стандартным именованным определением подпрограммы. В дальнейшем подпрограмму можно вызывать по имени.

Пример:

 

Параметр BLOCK - задает код подпрограммы

Может указываться без NAME. В этом случае функция sub вернет ссылку на код. Ссылку можно использовать для вызова и выполнения заданной подпрограммы.

Подобная подпрограмма будет называться анонимной.

Пример:

 

Параметр ATTRS - задает список атрибутов подпрограммы

ATTRS используется сравнительно редко. В списке атрибутов разделителями служат символы двоеточия или пробела.

Существует 3 стандартных атрибута подпрограмм: locked, method, lvalue. Атрибуты влияют на принципы использования подпрограммы.

  • Атрибут locked - используется при работе с потоками. При установке данного атрибута использование функции ограничивается только одним потоком в определенный момент времени (а остальные в это время сидят, нервно курят и ожидают освобождения подпрограммы).

  • Атрибут method - указывает, что подпрограмма является методом какого-то объекта.
    В сочетании с атрибутом locked организует не только блокировку подпрограммы и возможность ее использования только одним потоком, но и блокировку объекта, который вызывает этот метод.

    Использование атрибута method без locked довольно бессмысленно.

  • Атрибут lvalue - позволяет присвоить подпрограмме значение. При этом, подпрограмма должна возвращать значение, которое допускает такое присваивание.

    Пример:

    В чем смысл практического применения такого атрибута - для меня пока загадка.

Perl предоставляет возможности для самостоятельного создания атрибутов. Но в данном документе эту проблему я рассматривать не буду.

 

Параметр PROTO - задает список прототипов

Прототипы позволяют ввести проверку типа передаваемых подпрограмме данных. Проверка
осуществляется на стадии компиляции программы.

Пример:

С помощью прототипов указано, что подпрограмма может принимать 2 параметра - скаляр и хэш, в заданном порядке.

Если попробовать передать подпрограмме больше или меньше параметров, или вместо хеша - ссылку на хеш, то perl вернет ошибку:

При указании прототипов можно использовать следующие символы:

  • $ - подпрограмме должен быть передан скаляр.
  • & - подпрограмме должна быть передана в качестве параметра другая подпрограмма.
  • * - подпрограмме должен быть передан скаляр или ссылка на typeglob.
  • \символ - подпрограмме должна быть передана переменная типа "символ".
  • ; - символ ";" отделяет обязательные параметры от необязательных.
  • @ - объединяет все оставшиеся параметры и передает их подпрограмме как список.
  • % - объединяет все оставшиеся параметры и передает их подпрограмме как список.

Проверка прототипов не производится, если:

  • подпрограмма является методом объекта,
  • подпрограмма вызывается с указанием префикса "&".

 

Полезная ссылка

www.arininav.ru: Ю. Лукач "Справочник Веб-разработчика". Глава 6.6. Подпрограммы