feature (особенность) - Perl прагма для включения нового функционала. Детальное описание feature можно найти в perldoc, а тут приведу лишь некий краткий анонс.
В общем случае feature в perl-коде включаются следующим образом:
no feature - отключает действие feature:
use feature 'say' - включает использование Perl6 функции say.
Функция say аналогична print, но к выводу добавляет "\n".
Эта feature доступна с версии Perl 5.10.
use feature 'state' - сообщает компилятору о включении переменных состояния (state).
Для детального ознакомления изучаем Persistent Private Variables.
Эта feature доступна с версии Perl 5.10.
use feature 'unicode_strings' - сообщает компилятору использовать правила Unicode во всех строковых операциях, попадающих в сферу его действия feature. Это же относится и к регулярным выражениям. При этом внутреннее представление не изменяется, меняется лишь их интерпретация.
Рекомендуется изучить Perl Unicode Bug во избежание сюрпризов и недоразумений.
Эта функция доступна начиная с Perl 5.12; была почти полностью реализована в Perl 5.14; и продлена в Perl 5.16, чтобы перекрыть quotemeta.
use feature 'fc' - говорит компилятору включить поддержку функции fc.
fc EXPR - возвращает регистронезависимую версию EXPR.
Комплектное включение feature
Неявная загрузка feature.
Вместо загрузки отдельных feature можно позволить Perl неявно загрузить всё самому.
Для "однострочников" можно вместо -e использовать -E.
В скриптах - указать минимально используемую версию Perl. То есть:
В общем случае feature в perl-коде включаются следующим образом:
use feature qw(say switch);
given ($foo) {
when (1) { say "\$foo == 1" }
when ([2,3]) { say "\$foo == 2 || \$foo == 3" }
when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" }
when ($_ > 100) { say "\$foo > 100" }
default { say "None of the above" }
}
use feature ':5.10'; # загружает все feature доступные в perl 5.10
use v5.10; # неявно загружает :5.10 feature
Как правило невозможно добавит в perl-скрипт новый синтаксис, не нарушая существующий код. Использование feature даёт возможность минимизировать этот риск. Новые синтаксические конструкции могут быть включены лишь в часть кода и будут разбираться лишь тогда когда соответствующая прагма находится в области видимости. Тем не менее использование префикса CORE::префикса позволяет использовать все новые ключевые слова Perl, независимо от использование директивы feature. Например:илиuse feature "say"; say "test0";
CORE::say "test0";
no feature - отключает действие feature:
use feature 'say';
say "say is available here";
{
no feature 'say';
print "But not here.\n";
}
say "Yet it is here.";
use feature 'say' - включает использование Perl6 функции say.
Функция say аналогична print, но к выводу добавляет "\n".
Эта feature доступна с версии Perl 5.10.
use feature 'state' - сообщает компилятору о включении переменных состояния (state).
Для детального ознакомления изучаем Persistent Private Variables.
Эта feature доступна с версии Perl 5.10.
use feature 'state';
sub gimme_another { state $x; return ++$x }
Пример с использованием анонимной функции:
use feature 'state';
sub create_counter {
return sub { state $x; return ++$x }
}
use feature 'unicode_strings' - сообщает компилятору использовать правила Unicode во всех строковых операциях, попадающих в сферу его действия feature. Это же относится и к регулярным выражениям. При этом внутреннее представление не изменяется, меняется лишь их интерпретация.
Рекомендуется изучить Perl Unicode Bug во избежание сюрпризов и недоразумений.
Эта функция доступна начиная с Perl 5.12; была почти полностью реализована в Perl 5.14; и продлена в Perl 5.16, чтобы перекрыть quotemeta.
use feature 'fc' - говорит компилятору включить поддержку функции fc.
fc EXPR - возвращает регистронезависимую версию EXPR.
lc($this) eq lc($that) # Wrong!
# или
uc($this) eq uc($that) # Also wrong!
# или
$this =~ /^\Q$that\E\z/i # Right!
Теперь можно писать такfc($this) eq fc($that)
Комплектное включение feature
Комплект Включенные особенности
--------- -----------------
:default array_base
:5.10 say state switch array_base
:5.12 say state switch unicode_strings array_base
:5.14 say state switch unicode_strings array_base
:5.16 say state switch unicode_strings
unicode_eval evalbytes current_sub fc
:5.18 say state switch unicode_strings
unicode_eval evalbytes current_sub fc
:5.20 say state switch unicode_strings
unicode_eval evalbytes current_sub fc
Включение подверсии в feature не оказывает никакого эффекта. Например
use feature ":5.14.0"; # тоже, что и ":5.14" use feature ":5.14.1"; # тоже, что и ":5.14"
Неявная загрузка feature.
Вместо загрузки отдельных feature можно позволить Perl неявно загрузить всё самому.
Для "однострочников" можно вместо -e использовать -E.
В скриптах - указать минимально используемую версию Perl. То есть:
неявно сделает:use v5.10.0;
no feature ':all'; use feature ':5.10';