функция
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- СИНТАКСИС
- ОПИСАНИЕ
- ДОСТУПНЫЕ ФУНКЦИИ
- Функция 'say'
- Функция 'state'
- Функция 'switch'
- Функция 'unicode_strings'
- Функции 'unicode_eval' и 'evalbytes'
- Функция 'current_sub'
- Функция 'array_base'
- Функция 'fc'
- Функция 'lexical_subs'
- Функции 'postderef' и 'postderef_qq'
- Функция 'signatures'
- Функция 'refaliasing'
- Функция 'bitwise'
- Функция 'declared_refs'
- ПАКЕТЫ ФУНКЦИЙ
- НЕЯВНАЯ ЗАГРУЗКА
НАЗВАНИЕ
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'; # loads all features available in perl 5.10
use v5.10; # implicitly loads :5.10 feature bundle ОПИСАНИЕ
Обычно невозможно добавить новую синтаксическую конструкцию в Perl без нарушения работы некоторых существующих программ. Эта прагма предоставляет способ минимизировать этот риск. Новые синтаксические конструкции или новые семантические значения для старых конструкций могут быть включены с помощью use feature 'foo', и они будут анализироваться только при наличии соответствующей прагмы функции. (Тем не менее, префикс CORE:: предоставляет доступ ко всем ключевым словам Perl независимо от этой прагмы.)
Лексическое воздействие
Как и другие прагмы (use strict, например), функции имеют лексическое воздействие. use feature qw(foo) функция «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' сообщает компилятору о включении функции say Perl 6.
См. "say" в perlfunc для получения подробностей.
Эта функция доступна начиная с Perl 5.10.
Функция 'state'
use feature 'state' сообщает компилятору о включении переменных state.
См. "Постоянные частные переменные" в perlsub для получения подробностей.
Эта функция доступна начиная с Perl 5.10.
Функция 'switch'
ПРЕДУПРЕЖДЕНИЕ: Поскольку оператор интеллектуального соответствия находится в экспериментальной стадии, Perl будет предупреждать о её использовании, если вы не отключили предупреждение явно:
no warnings "experimental::smartmatch"; use feature 'switch' сообщает компилятору о включении конструкции given/when Perl 6.
См. "Условные операторы" в perlsyn для получения подробностей.
Эта функция доступна начиная с Perl 5.10.
Функция 'unicode_strings'
use feature 'unicode_strings' сообщает компилятору использовать правила Unicode во всех операциях со строками, выполняемых в рамках её области видимости (если они также не находятся в области видимости use locale или use bytes). То же самое относится ко всем регулярным выражениям, скомпилированным в рамках области видимости, даже если они выполняются за её пределами. Она не изменяет внутреннее представление строк, а только то, как они интерпретируются.
no feature 'unicode_strings' сообщает компилятору использовать традиционные правила Perl, где используются правила нативного набора символов, если Perl не понимает, что требуется Unicode. Это может привести к некоторым неожиданностям, когда поведение внезапно меняется. (См. "Ошибка Unicode" в perlunicode для получения подробностей.) По этой причине, если вы потенциально используете Unicode в вашей программе, подпрагма use feature 'unicode_strings' настоятельно рекомендуется.
Эта функция доступна начиная с Perl 5.12; была практически полностью реализована в Perl 5.14; и расширена в Perl 5.16, чтобы охватить quotemeta; была дополнительно расширена в Perl 5.26, чтобы охватить оператор диапазона; и снова была расширена в Perl 5.28, чтобы охватить обработку пробелов при split.
Функции 'unicode_eval' и 'evalbytes'
Вместе эти две функции предназначены для замены устаревшей функции строк eval, которая в некоторых случаях ведёт себя проблематично. Они доступны начиная с Perl 5.16 и включены по умолчанию с объявлением use 5.16 или выше.
unicode_eval изменяет поведение обычной функции строк eval для более согласованной работы, особенно в мире Unicode. Некоторые (неправильные) поведения не могли быть изменены без нарушения функций, которые от них зависели, поэтому функция может быть включена и выключена. Подробности см. в "Под функцией "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. Она была включена по умолчанию, но отключена под use v5.16 (см. "НЕЯВНАЯ ЗАГРУЗКА", ниже) и недоступна с perl 5.30.
Эта функция доступна под этим именем начиная с Perl 5.16. В предыдущих версиях она просто всегда была включена, и эта прагма ничего не знала об этом.
Функция 'fc'
use feature 'fc' сообщает компилятору включить функцию fc, которая реализует Unicode-преобразование к нижнему регистру.
См. "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 и Perl 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'
Это приводит к тому, что четыре стандартных побитовых оператора (& | ^ ~) обрабатывают свои операнды как числа, а также вводит четыре новых оператора с точкой (&. |. ^. ~.), которые обрабатывают свои операнды как строки. То же самое относится к вариантам присваивания (&= |= ^= &.= |.= ^.=).
Подробности см. в "Операторы поразрядных строк" в 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, или локализацией с помощью local. Она предназначена в основном для совместного использования с функцией "refaliasing". Примеры см. в "Объявление ссылки на переменную" в perlref.
Эта функция доступна начиная с Perl 5.26.
ПАКЕТЫ ФУНКЦИЙ
Можно загружать несколько функций вместе, используя пакет функций. Имя пакета функции предваряется двоеточием для его отличия от реальной функции.
use feature ":5.10"; Доступны следующие пакеты функций:
bundle features included
--------- -----------------
:default
:5.10 say state switch
:5.12 say state switch unicode_strings
:5.14 say state switch unicode_strings
: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
:5.30 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.30.3/feature