Что такое функция 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. Подпрограммы