Атрибуты появились в Perl довольно давно. Знаменательная для старожилов версия Perl 5.005 содержала довольно бесполезную прагму
Сейчас их наверняка назвали бы не атрибутами, а тегами. Выглядит все просто — к объявляемой переменной или функции можно дописать несколько меток. Есть несколько стандартных для Perl атрибутов, но можно вводить и свои собственные. Встроенные атрибуты записываются строчными буквами, и потому использовать такой регистр для пользовательских меток не рекомендуется — во избежание накладок в будущем и варнингов в настоящем.
Синтаксис атрибутов достаточно понятен:
Интерпретатор не накладывает ограничений на наличие пробела между двоеточием и названием атрибута, лично мне кажется более наглядным, когда они записаны слитно.
Атрибуты можно навешивать на функции и на переменные — скаляры, хеши, массивы.
За примерами ходить недалеко — на CPAN живет группа модулей, объединенных под именем
Первый из них,
Предлагаемый им синтаксис гораздо нагляднее:
Второй класс,
Третий класс,
Просто ставим к методу атрибут
Интересно? Тогда не забудьте заглянуть в исходный код модулей.
UPD: продолжение статьи: Атрибуты: взгляд внутрь
attrs
. Прагма эта позволяла навесить на функцию пару встроенных атрибутов, для чего требовалось указать внутри этой функции use attrs
с соответствующими параметрами. Правда, уже в марте 2000 года в Perl 5.6 эта прагма была объявлена deprecated. На замену ей пришел модуль attributes
, а также расширенный синтаксис для объявления переменных/функций. Стало возможным создавать для них собственные метки и вводить для этих меток обработчики. По непонятным причинам, популярность атрибуты так и не получили. А жаль.Ближе к сути
Сейчас их наверняка назвали бы не атрибутами, а тегами. Выглядит все просто — к объявляемой переменной или функции можно дописать несколько меток. Есть несколько стандартных для Perl атрибутов, но можно вводить и свои собственные. Встроенные атрибуты записываются строчными буквами, и потому использовать такой регистр для пользовательских меток не рекомендуется — во избежание накладок в будущем и варнингов в настоящем.
Синтаксис атрибутов достаточно понятен:
my $myVar : myAttribute = 10;
sub mySub : myAttribute1 : myAttribute2 {:}
Интерпретатор не накладывает ограничений на наличие пробела между двоеточием и названием атрибута, лично мне кажется более наглядным, когда они записаны слитно.
Атрибуты можно навешивать на функции и на переменные — скаляры, хеши, массивы.
Для чего это нужно
За примерами ходить недалеко — на CPAN живет группа модулей, объединенных под именем
Attribute::Util
. Я не буду комментировать возможность их применения в реальных проектах, но как простая и наглядная иллюстрация — это то, что нужно.Первый из них,
Attribute::Abstract
, предлагает замену для классического описания абстрактных методов. Обратите на него внимание, если у вас есть подобные объявления:sub myMethod { die "Abstract method called!"; }
Предлагаемый им синтаксис гораздо нагляднее:
sub myMethod: Abstract;
Второй класс,
Attribute::Memoize
, позволяет добавить кеширование к функциям, которые возвращают постоянный результат для одинаковых наборов аргументов. Конечно, завернуть код функции в if
-блок труда не составит, но опять же — можно просто пометить функцию атрибутом :Memoize
и знать, что ее результат кешируется.Третий класс,
Attribute::Method
, позволяет избавиться от написания первой строки практически любого метода:my $self = shift;
Просто ставим к методу атрибут
:Method
, и $self
появляется сам собой. Кроме того, можно указать, какие аргументы переданы методу — тогда они тоже будут проинициализированы:sub myMethod :Method($x) { print "self=$self, x=$x\n" }
Интересно? Тогда не забудьте заглянуть в исходный код модулей.
UPD: продолжение статьи: Атрибуты: взгляд внутрь