Spec-Zone.ru › Perl 5.30

функция

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • СИНТАКСИС
  • ОПИСАНИЕ
    • Лексическое воздействие
    • отсутствие функции
  • ДОСТУПНЫЕ ФУНКЦИИ
    • Функция '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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API