функция
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- СИНОПСИС
- ОПИСАНИЕ
- ДОСТУПНЫЕ ФУНКЦИИ
- Функция 'say'
- Функция 'state'
- Функция 'switch'
- Функция 'unicode_strings'
- Функции 'unicode_eval' и 'evalbytes'
- Функция 'current_sub'
- Функция 'array_base'
- Функция 'fc'
- Функция 'lexical_subs'
- Функции 'postderef' и 'postderef_qq'
- Функция 'signatures'
- Функция 'refaliasing'
- Функция 'bitwise'
- Функция 'declared_refs'
- ПАКЕТЫ ФУНКЦИЙ
- НЕЯВНАЯ ЗАГРУЗКА
НАЗВАНИЕ
функция - Perl-pragma для активации новых функций
СИНОПСИС
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'; # loads all features available in perl 5.10
use v5.10; # implicitly loads :5.10 feature bundle ОПИСАНИЕ
Обычно невозможно добавить новый синтаксис в Perl, не сломав некоторые существующие программы. Данный pragma предоставляет способ минимизировать эту опасность. Новые синтаксические конструкции или новые семантические значения старых конструкций могут быть активированы с помощью use feature 'foo', и будут обработаны только при наличии соответствующего pragma функции. (Тем не менее, префикс CORE:: предоставляет доступ ко всем ключевым словам Perl независимо от этого pragmas).
Лексическое воздействие
Как и другие pragmas (use strict, например), функции имеют лексическое воздействие. use feature qw(foo) будет доступна только с этого момента до конца содержащего блока.
{
use feature 'say';
say "say is available here";
}
print "But not here.\n";
no feature
Функции также могут быть отключены с помощью no feature "foo". Это также имеет лексическое воздействие.
use feature 'say';
say "say is available here";
{
no feature 'say';
print "But not here.\n";
}
say "Yet it is here."; no feature без указанных функций сбросит их на значения по умолчанию. Для отключения всех функций (необычный запрос!) используйте no feature ':all'.
ДОСТУПНЫЕ ФУНКЦИИ
Функция 'say'
use feature 'say' сообщает компилятору активировать функцию стиля Perl 6 say.
Для получения подробной информации см. "say" в perlfunc.
Эта функция доступна начиная с Perl 5.10.
Функция 'state'
use feature 'state' сообщает компилятору активировать переменные state.
Для получения подробной информации см. "Постоянные частные переменные" в perlsub.
Эта функция доступна начиная с Perl 5.10.
Функция 'switch'
ПРЕДУПРЕЖДЕНИЕ: Поскольку оператор умного соответствия является экспериментальным, Perl выведет предупреждение при использовании этой функции, если предупреждение не было отключено явно:
no warnings "experimental::smartmatch"; use feature 'switch' сообщает компилятору активировать конструкцию Perl 6 given/when.
Для получения подробной информации см. "Операторы switch" в perlsyn.
Эта функция доступна начиная с Perl 5.10.
Функция 'unicode_strings'
use feature 'unicode_strings' сообщает компилятору использовать правила Юникода во всех операциях со строками, выполняемых в пределах его области действия (если они также не находятся в области действия use locale или use bytes). То же самое относится ко всем регулярным выражениям, скомпилированным в области действия, даже если они выполняются за её пределами. Это не изменяет внутреннее представление строк, а только то, как они интерпретируются.
no feature 'unicode_strings' сообщает компилятору использовать традиционные правила Perl, в которых используются правила нативной кодировки, если Perl явно не определил необходимость использования Юникода. Это может привести к некоторым неожиданностям, когда поведение внезапно меняется. (См. "Ошибка Юникода" в perlunicode для получения подробной информации.) По этой причине, если вы потенциально используете Юникод в своей программе, под-pragma use feature 'unicode_strings' настоятельно рекомендуется.
Эта функция доступна начиная с Perl 5.12; почти полностью реализована в Perl 5.14; расширена в Perl 5.16, чтобы охватить quotemeta; ещё раз расширена в Perl 5.26 для охвата оператор диапазона; и снова расширена в Perl 5.28 для охвата разделения по специальным пробелам.
Функции 'unicode_eval' и 'evalbytes'
Вместе эти две функции предназначены для замены устаревшей функции строковой eval, которая ведёт себя проблематично в некоторых случаях. Они доступны начиная с Perl 5.16 и включены по умолчанию при объявлении use 5.16 или выше.
unicode_eval изменяет поведение обычной строковой eval, чтобы обеспечить более согласованную работу, особенно в мире Юникода. Некоторые (неправильные) действия не могли быть изменены без нарушения того, что на них полагаются, поэтому функция может быть включена и отключена. Подробности см. в "В разделе "функции unicode_eval" в perlfunc.
evalbytes похожа на строковую eval, но работает со потоком байтов, который не закодирован в UTF-8. Подробности см. в "evalbytes EXPR" в perlfunc. Без объявления use feature 'evalbytes' или use v5.16 (или выше) в текущей области видимости, к нему можно получить доступ, написав вместо этого CORE::evalbytes.
Функция 'current_sub'
Эта функция предоставляет маркер __SUB__, который возвращает ссылку на текущую подпрограмму или undef вне подпрограммы.
Эта функция доступна начиная с Perl 5.16.
Функция 'array_base'
Эта функция поддерживает устаревшую переменную $[. См. "$[" в perlvar и arybase. Она включена по умолчанию, но отключена в use v5.16 (см. "НЕЯВНАЯ ЗАГРУЗКА" ниже).
Эта функция доступна под этим именем начиная с Perl 5.16. В предыдущих версиях она просто постоянно была включена, и данный pragma ничего не знал о ней.
Функция 'fc'
use feature 'fc' сообщает компилятору активировать функцию fc, которая реализует сведение Юникод к нижнему регистру.
Для получения подробной информации см. "fc" в perlfunc.
Эта функция доступна в Perl 5.16 и более поздних версиях.
Функция 'lexical_subs'
В версиях Perl до 5.26 эта функция активировала объявление подпрограмм с помощью синтаксиса my sub foo, state sub foo и our sub foo. Для получения подробной информации см. "Лексические подпрограммы" в perlsub.
Эта функция доступна с Perl 5.18. От Perl 5.18 до 5.24 она считалась экспериментальной, и Perl выводил предупреждение при её использовании, за исключением случаев явного отключения:
no warnings "experimental::lexical_subs"; Начиная с Perl 5.26, использование этой функции больше не вызывает предупреждения, хотя категория предупреждений experimental::lexical_subs всё ещё существует (для совместимости с кодом, который её отключает). Кроме того, этот синтаксис не только перестал быть экспериментальным, но и включен во все коды Perl независимо от того, какие объявления функций присутствуют в области действия.
Функции 'postderef' и 'postderef_qq'
Функция 'postderef_qq' расширяет применимость синтаксиса постфиксной деференции постфиксной деференции, так что постфиксная деференция массивов и скаляров доступна в интерполяциях двойных кавычек. Например, она делает следующие два утверждения эквивалентными:
my $s = "[@{ $h->{a} }]";
my $s = "[$h->{a}->@*]"; Эта функция доступна начиная с Perl 5.20. В Perl 5.20 и 5.22 она считалась экспериментальной, и Perl выводил предупреждение при её использовании, за исключением случаев явного отключения:
no warnings "experimental::postderef"; Начиная с Perl 5.24, использование этой функции больше не вызывает предупреждение, хотя категория предупреждений experimental::postderef всё ещё существует (для совместимости с кодом, который её отключает).
Функция 'postderef' использовалась в Perl 5.20 и 5.22 для активации синтаксиса постфиксной деференции за пределами интерполяций двойных кавычек. В этих версиях её использование вызывало предупреждение experimental::postderef аналогично функции 'postderef_qq'. Начиная с Perl 5.24, этот синтаксис не только перестал быть экспериментальным, но и включён во все коды Perl независимо от того, какие объявления функций присутствуют в области действия.
Функция 'signatures'
ПРЕДУПРЕЖДЕНИЕ: Эта функция всё ещё является экспериментальной, и её реализация может измениться в будущих версиях Perl. По этой причине Perl выведет предупреждение при её использовании, если предупреждение не было отключено явно:
no warnings "experimental::signatures"; Это включает распаковку аргументов подпрограммы в лексические переменные с помощью синтаксиса, такого как
sub foo ($left, $right) {
return $left + $right;
} Для получения подробной информации см. "Функции" в perlsub.
Эта функция доступна начиная с Perl 5.20.
Функция 'refaliasing'
ПРЕДУПРЕЖДЕНИЕ: Эта функция всё ещё является экспериментальной, и её реализация может измениться в будущих версиях Perl. По этой причине Perl выведет предупреждение при её использовании, если предупреждение не было отключено явно:
no warnings "experimental::refaliasing"; Это включает алиасинг путём присваивания ссылкам:
\$a = \$b; # $a and $b now point to the same scalar
\@a = \@b; # to the same array
\%a = \%b;
\&a = \&b;
foreach \%hash (@array_of_hash_refs) {
...
} Для получения подробной информации см. "Присваивание ссылкам" в perlref.
Эта функция доступна начиная с Perl 5.22.
Функция 'bitwise'
Это позволяет четырём стандартным побитовым операторам (& | ^ ~) обрабатывать свои операнды последовательно как числа, и вводит четыре новых оператора с точкой (&. |. ^. ~.), которые обрабатывают свои операнды последовательно как строки. То же самое относится к вариантам присваивания (&= |= ^= &.= |.= ^.=).
Подробности см. в разделе "Bitwise String Operators" в perlop.
Эта функция доступна начиная с Perl 5.22. Начиная с Perl 5.28, use v5.28 включит функцию. До версии 5.28 она всё ещё была экспериментальной и генерировала предупреждение в категории "experimental::bitwise".
Функция 'declared_refs'
ПРЕДУПРЕЖДЕНИЕ: Эта функция всё ещё находится на стадии эксперимента и её реализация может измениться в будущих версиях Perl. По этой причине Perl будет выводить предупреждение при использовании этой функции, если вы явно не отключили предупреждение:
no warnings "experimental::declared_refs"; Это позволяет объявить ссылку на переменную с помощью my, state, our our или локализовать с помощью local. Она предназначена в основном для совместного использования с функцией "refaliasing". Примеры см. в разделе "Declaring a Reference to a Variable" в perlref.
Эта функция доступна начиная с Perl 5.26.
ПАКЕТЫ ФУНКЦИЙ
Возможна загрузка нескольких функций вместе, используя пакет функций. Имя пакета функций предваряется двоеточием, чтобы отличить его от фактической функции.
use feature ":5.10"; Доступны следующие пакеты функций:
bundle features included
--------- -----------------
: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
:5.22 say state switch unicode_strings
unicode_eval evalbytes current_sub fc
:5.24 say state switch unicode_strings
unicode_eval evalbytes current_sub fc
postderef_qq
:5.26 say state switch unicode_strings
unicode_eval evalbytes current_sub fc
postderef_qq
:5.28 say state switch unicode_strings
unicode_eval evalbytes current_sub fc
postderef_qq bitwise Пакет :default представляет набор функций, который включен до любой use feature или no feature декларации.
Указание подверсий, таких как 0 в 5.14.0 в пакетах функций, не имеет эффекта. Пакеты функций гарантированно остаются одинаковыми для всех подвариантов.
use feature ":5.14.0"; # same as ":5.14"
use feature ":5.14.1"; # same as ":5.14" НЕЯВНАЯ ЗАГРУЗКА
Вместо загрузки пакетов функций по имени, проще позволить Perl выполнить неявную загрузку пакета функций за вас.
Существует два способа неявной загрузки прагмы feature:
-
Используя переключатель
-Eв командной строке Perl вместо-e. Это включит пакет функций для этой версии Perl в главном модуле компиляции (то есть, в однострочном фрагменте кода, который следует за-E). -
Явно требуя минимальную версию Perl для вашей программы с помощью конструкции
use VERSION. То есть,use v5.10.0;выполнит неявную
no feature ':all'; use feature ':5.10';и так далее. Обратите внимание, как конечная подверсия автоматически удаляется из версии.
Но чтобы избежать предупреждений о переносимости (см. "use" в perlfunc), вы можете предпочесть:
use 5.010;с тем же эффектом.
Если требуемая версия старше Perl 5.10, вместо этого автоматически загружается пакет функций ":default".
В отличие от
use feature ":5.12", указаниеuse v5.12(или любой более поздней версии) также выполняет эквивалентuse strict; см. "use" в perlfunc для получения дополнительной информации.
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.28.3/feature